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.对象锁和类锁,相互不影响
posted @ 2018-03-16 16:47  架构之美,智慧之光  阅读(1357)  评论(0编辑  收藏  举报