1.synchronized同步方法(锁加在实例对象上)
如果是方法内部的私有变量,则不存在线程安全问题,既是线程安全的。而实例变量则是非安全的。多个线程访问多个实例对象时,jvm会创建多个锁。
synchronized的锁是加在实例对象上的,如果一个类里有的方法加了synhronized同步操作,有的方法没有加,则其它线程可以以异步的方式访问类中非synchronized方法,否则,在一个线程执行类中某一个同步方法,则其它线程调用类的其它方法时需要等待,也就是同步。
2.脏读
多个线程对实例对象属性进行值操作,会出现数据不同步的情况,是不同线程争抢实例变量的情况。
3.synchronized 锁的重入
当一个线程得到一个实例对象的锁之后,再次请求该实例对象内的同步方法时,是永远能够得到锁的,同时重入锁也支持父子类继承的环境中。
4.当线程执行同步方法时,发生异常,则会释放同步锁,其它线程正常执行
5.同步不具有继承性
当父类方法是同步时,子类重写父类方法,则子类中该方法不具有同步性。
6.用同步代码块方式解决同步方法时时间的浪费
因为方法同步则是持有了实例对象锁,所以在同步方法时,会造成大量的时间等待,将同步锁控制范围缩小到最小范围,可以一定程度上提高同步性能。
7.synchronized(this)
当一个线程执行一个类中synchronized(this)代码块时,其它线程反问别的synchronized(this)时则被阻塞,因为synchronized(this)使用的是对象监视器。
8.synchronized是不能保证调用方法的执行同步和顺序性,也就是线程的调用是无序的
此时极易出现脏读的情况,同步代码块则可以处理
9.总结:synchronized和synchronized(this)的作用
多个线程调用同一个对象中不同名称的synchronized同步方法或synchronized(this)同步代码块时,是同步的,阻塞的,同一时间只有一个线程可以执行synchronized、synchronized(this)方法中的代码。
10.synchronized(非this对象x)
java中的synchronized(this)可以是非this当前实例对象,这样做反而是有好处的,在一个类中有过多的synchronized方法,很影响运行效率,则可以在使用使用该对象时加入同步操作,则可以大大提高运行效率。使用synchronized(非this对象x)得出结论如下:
1)当多个线程同时执行synchronized(x){}同步代码块时呈同步结果
2)当其它线程执行x对象中的synchronized同步方法时呈同步状态
3)当其它线程执行x对象方法中的synchronized(this)代码块时呈同步状态
在使用该方式的前提必须是同一个对象实例!!
11.静态同步 synchronized方法与synchronized(class)代码块
当synchronized加在类的静态方法上时,则是给当前类加锁。
12.synchronized方法无限等待与解决
改为同步代码块。
13.多线程的死锁
只要出现双方互相等待对方释放锁就会出现死锁的现象