synchronized锁的是什么?


synchronized是java中并发编程最重要的关键字之一。如果没搞清楚synchronized锁的是什么,可能导致用了没效果,没控制住并发访问

 
synchronized常用的方式有以下四种
public class SyncTest{
    public  synchronized void methodA(){
    }
 
    public void methodB(){
             synchronized(this){
        }
    }
 
    public void methodC(){
             synchronized(xxx.class){
        }
    }
 
    public  static synchronized methodD(){
    }
}
 
前两种锁的是 实例对象,即对象锁,后两种锁的是 类对象,即类锁(类锁只是个概念,因为本质锁的本质还是对象)
 
结论:
1.持有的是同一个实例,是能够达到锁住资源,不让别的线程进入的目的的。就算访问的不是相同的代码块,也会等待。两个线程持有的是 同一个syncTest对象,一个执行syncTest.methodA(),另一个执行syncTest.methodB(),也会有锁的效果。
 
2.但是如果大家都是 new SyncTest()的话,即使访问同一段代码,是 锁不住的!!!!!!!因为大家所持的实例对象不一样!!!!
 
3.后两种的话,无论是用类直接调用,还是实例调用,无论是否同一个实例,都会互斥。
 
4.对象锁和类锁,相互不影响


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM