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关键词解决的是多个线程访问资源的同步性。