一、synchronized对象监视器为Object时的使用
1.1 synchronized方法
1.当A线程调用anyObject对象加入synchronized关键字的x方法,A线程获得了X方法的锁,即获得了对象锁,所以其他线程等A线程执行完毕才可以调用X方法,但其他线程可以随意调用其他的非synchronized同步方法;
2..当A线程调用anyObject对象加入synchronized关键字的x方法,其他线程调用该对象的非x方法的synchronized同步方法时,必须等A线程执行完一个完整的任务时才能执行;
3.锁重入:自己可以再次获取自己的内部锁,如:一个线程获取到了某个对象的锁,此时对象锁还没释放,当再次想获取这个对象的锁时还时可以获取的,如果不可锁重入的话,就会造成死锁;
4.出现异常,锁自动释放;
5.同步不具有继承性;
1.2synchronized(非this对象X)
1.synchronized(非this)代码块中的程序与同步方法时异步的,不予其他锁this同步方法争抢this锁,提升效率;
2.对象监视器必须是同一个对象,否则运行异步;
3.多个线程同时执行synchronized(X)同步代码时呈同步效果;
4.当其他线程执行x对象中synchronized同步方法时呈现同步;
5.当其他线程执行x对象中synchronized(this)同步块代码时呈现同步。
1.3synchronized同步语句块
1.synchronized方法某些情况下存在弊端:如A线程调用同步方法执行一个长时间的任务,那边么B线程需要等待比较长的时间,这个可以用synchronized同步语句块来解决;
synchronized(this)
1.与synchronized方法遵循规则一一致:
1.1对其他synchronized方法或synchronized(this)同步代码块调用呈阻塞状态;
1.2同一时间只有一个线程可以执行同步块中的代码。
二、synchronized对象监视器为CLASS时的使用
2.1 静态同步synchronized方法
2.2 synchronized(class)
1.synchronized(string)同步快与string联合使用的注意事项,因常量池的存在会影响结果;
2.死锁,因不同线程都在等待根本不可能释放的锁,从而导致所有的任务无法继续完成。
3.多个线程同时持有锁对象,同步环是异步关键看是否锁的是同一对象;
4.锁对象与锁类之间为异步;
5.只要对象不变,即使对象的属性被改变,运行结果还时同步;
三、非线程安全如何出现
1.多个线程对同一对象中的实例变量进行并发访问时发生;
2.方法内部的私有变量不存在非线程安全问题,因为方法内部的变量是私有特性造成的;
3.多个线程调用多个对象是不会出现线程安全,因为JVM将每个对象创建一个锁。
4.线程安全包含原子性与可见性两个方面,java同步机制是围绕这两个方面确保线程安全的;
四、volatile关键字
1.主要作用使变量在线程之间可见,强制从公共堆栈中取得变量的值,而不是从线程私有数据栈取得变量的值;
2.volatile关键字致命的缺点是不支持原子性;
3.关键字volatile主要使用场合是在多个线程可以感知实例变量被该变了,并且可以获得最新的使用,也就是多线程读取共享变量时可以获取到最新值得使用;
五、volatile与synchronized的区别及使用情况
1.volatile是线程轻量级的实现,所以volatile性能比synchronized要好,并且volatile只能修饰变量,而synchronized可以修饰方法及代码块;
2.多线程volatile不发生阻塞,而synchronized发生阻塞;
3.volatile保证可见性,但是不保证原子性,而synchronized保证原子性,也间接保证可见性;