Java多线程摘要--对象及变量的并发访问

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Little_Matches/article/details/79953579

1:”非线程安全”问题在于”实例变量”中,如果是方法内部的私有变量,则不存在”非线程安全”问题.

2:关键字synchronized取得的都是对象锁,而不是把一段代码或方法(函数)当做锁, 所以哪个线程先执行synchronized关键字的方法,哪个线程就持有该方法所属对象的锁Lock,那么其他线程只能呈等待状态,前提是多个线程访问的是同一个对象.

(注:如果多个线程访问多个对象,则JVM会创建多个锁)==

3:A线程先持有object对象的Lock锁,B线程可以以异步的方式调用object对象中的非synchronized类型的方法

4:A线程先持有object对象的Lock锁,B线程如果在这时调用object对象中的synchronized类型的方法,则需要等待,也就是同步

5:一个synchronized方法/块的内部调用的其他synchronized方法/块时,是永远可以得到锁的.

6:当存在父子类继承关系时,子类是完全可以通过”可重入锁”调用父类的同步方法的.

7:出现异常的锁被自动释放.

8:在使用同步synchronized(this)代码块时需要注意的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对同一个object中的所有其他synchronized(this)同步代码块的访问将被阻塞,这说明synchronized使用的”对象监视器”是一个.

9:synchronized代码块具有同步性

10:synchronized(this)代码块是锁定当前对象的

(1)synchronized同步方法

1)对其他synchronized同步方法或synchronized(this)代码块调用呈阻塞状态
2)同一时间只有一个线程可以执行synchronized同步方法中的代码

(2)synchronized(this)同步代码块

1)对其他synchronized同步方法或synchronized(this)代码块调用呈阻塞状态
2)同一时间只有一个线程可以执行synchronized(this)同步代码块中的代码

11:对于synchronized(非this对象x)同步代码块

1)在多个线程持有”对象监视器”为同一个对象的前提下,同一时间只有一个线程可以执行synchronized(非this对象x)同步代码块中的代码

2)当持有”对象监视器”为同一个对象的前提下,同一时间只有一个线程可以执行synchronized(非this对象x)同步代码块中的代码

12:同步代码块放在非同步synchonized方法中进行声明,并不能保证调用方法的线程的执行同步/顺序性,也就是线程调用方法的顺序是无序的,虽然在同步块中执行的顺序是同步的,这样极易出现”脏读”问题

同步代码块

13:”synchronized(非this对象x)”格式的写法是将x对象本身作为”对象监视器”,这样就可以得出以下3个结论:

1)当多个线程同时执行synchronized(x){}同步代码块时呈现同步效果.

2)当其他线程执行x对象中synchronized同步方法时呈现同步效果.

3)当其他线程执行x对象方法里面synchronized(this)代码块时也呈现同步效果.

14:synchronized关键字加到static静态方法上是给Class类上锁,而synchronized关键字加到非static静态方法上是给对象加锁

15:异步的原因是持有不同的锁,一个是对象锁,一个是Class锁,而Class锁可以对类的所有对象实类起作用,同步synchronized(Class)代码块的作用其实和synchronized static方法的作用是一样的

16:将synchronized(String)同步块与String 联合使用时,要注意常量池以带来的一些例外.,因此在大多数的情况下,同步synchronized代码块都不使用String作为锁对象,而改用其他.比如new Object() 实例化一个Object对象,但它并不放入缓存中.

17:只要对象不变,即使对象的属性被改变,运行的结果还是同步的.

18:关键字volatile的主要作用是使变量在多个线程间可见

19:关键字volatile的作用是强制从公共堆栈中取变量的值,而不是从线程私有数据栈中取得变量的值

20:关键字与synchronized进行比较:

1)关键字volatile是线程同步的轻量级实现,所以volatile性能肯定比synchronized要好,volatile只能修饰于变量,而synchronized可以修饰方法,以及代码块
2)多线程访问volatile不会发生阻塞,而synchronized会出现阻塞
3)volatile能保证数据的可见性,但不能保证原子性;而synchronized可以保证原子性,也可以间接保证可见性,因为它会将私有内存和公共内存中的数据同步.
4)关键字volatile解决的是变量在多个线程之间的可见性;而synchronized关键字解决的是多线程之间访问资源的同步性

21:volatile关键字只有可见性,不具备同步性,也就不具备原子性.

22:原子类也并不完全安全,因为方法是原子性的,但是方法和方法之间的调用却不是原子性的,解决还需要synchronized

猜你喜欢

转载自blog.csdn.net/Little_Matches/article/details/79953579
今日推荐