本篇主要介绍Java多线程中的同步,也就是如何在Java语言中写出线程安全的程序,如何在Java语言中解决非线程安全的相关问题。没错就是使用synchronized。 如何解决线程安全问题?那么一般来说,是如何解决线程安全问题的呢? 基本上所有的并发模式在解决线程安全问题时,都采用“序列化访问临界资源”的方案,即在同一时刻,只能有一个线程访问临界资源,也称作同步互斥访问。 通常来说,是在访问临界资源的代码前面加上一个锁,当访问完临界资源后释放锁,让其他线程继续访问。 在Java中,提供了两种方式来实现同步互斥访问:synchronized和Lock。 本文主要讲述synchronized的使用方法,Lock的使用方法在下一篇博文中讲述。 synchronized同步方法synchronized是Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。在了解synchronized关键字的使用方法之前,我们先来看一个概念:互斥锁,顾名思义:能达到互斥访问目的的锁。 举个简单的例子:如果对临界资源加上互斥锁,当一个线程在访问该临界资源时,其他线程便只能等待。 在Java中,每一个对象都拥有一个锁标记(monitor),也称为监视器,多线程同时访问某个对象时,线程只有获取了该对象的锁才能访问。 在Java中,可以使用synchronized关键字来标记一个方法或者代码块,当某个线程调用该对象的synchronized方法或者访问synchronized代码块时,这个线程便获得了该对象的锁,其他线程暂时无法访问这个方法,只有等待这个方法执行完毕或者代码块执行完毕,这个线程才会释放该对象的锁,其他线程才能执行这个方法或者代码块。 synchronized的使用
synchronized注意事项
下面通过代码来实现: 1)当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。 2)然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。 3)尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。 4)第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。 5)每个类也会有一个锁,它可以用来控制对static数据成员的并发访问。 第一个线程里面执行的是insert方法,不会导致第二个线程执行insert1方法发生阻塞现象。 面试题当一个线程进入一个对象的synchronized方法A之后,其它线程是否可进入此对象的synchronized方法B? synchronized关键字的用法? 简述synchronized 和java.util.concurrent.locks.Lock的异同? 原文作者:嘟嘟MD 原文地址:http://www.jianshu.com/p/9474d64575b0 来源:网络。若涉及版权问题,烦请原作者联系我们,我们会在24小时内删除处理,谢谢! 中软高科 微信号:javaedu
|
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|