对象和变量的并发访问

synchronized()

synchronized()可以将线程的对象进行上锁。在类中使用synchronized(),在创建该类对象的同时就会创建锁,换句话说就是创建几个对象就会创建几个锁,这些实例对象之间不会相互影响,也不会出现等待的现象。如果只创建一个该类的对象,那么在运行过程中,共用相同的资源。

两个线程共用同一个对象资源,当A线程持有上锁的方法以后,B线程可以异步调用其他非上锁的方法。当A线程持有上锁的方法以后,B线程也需要调用其他上锁的方法只能等待,及同步运行。

一个上锁的方法中可以继续调用自己的synchronized的方法,称之为锁重入。当被锁上的线程出现异常线程会自动释放锁资源。

使用synchronized同步执行整个方法的代码会延长代码执行的时间,使代码的执行效率较低。可以通过同步执行部分代码(synchronized(this))块来减少代码的耗时。

在使用synchronized(this)时需要注意,在一个实例对象中synchronized(this)阻塞将会导致该对象中其他的synchronized(this)也会被阻塞。

(1)、多个线程同时执行synchronized(x){},成同步效果。(2)、当其他线程将一个实例对象synchronized(x)后其他synchronized同步方法成同步效果。(3)、当其他线程直线对象x时其他线程中的synchronized(this)也成同步效果。

synchronized public static 。。。是将Class类加锁,synchronized 是将实例对象加锁。Class类锁可以对所有的类都起作用。

volatile和synchronized

(1)、关键词volatile是线程同步的轻量级实现,所以volatile性能肯定是要比synchronized要好,并且volatile是能修饰于变量,而synchronized可以修饰方法,以及代码块。随着JDK新版本的发布,synchronized关键词在执行效率上得到了很大的提升,在开发中使用synchronized关键词的比率还是比较大的

(2)、多线程访问volatile不会发生阻塞,而synchronized会发生阻塞

(3)、volatile能保证数据的可见性,但是不能保证原子性;而synchronized可以保证原子性也可以间接保证可见性,因为他会为将私有内存和公共内存中的数据做同步。

(4)、关键词volatile解决的是变量在多个线程之间的可见性;而synchronized关键词解决的是多个线程访问资源的同步性。

猜你喜欢

转载自blog.csdn.net/be__yond/article/details/79473723