JAVA如果用 this 作为锁,是所有同一个的类的对象多用类这个同一把锁么?

如果用 this 作为锁,是所有同一个的类的对象多用类这个同一把锁么?如果不是,这个类的每个线程对象都用自己(this)自己作为锁,那么线程之间并没有去竞争同一把锁。所以我的推断是:如果用 this 作为锁,所有同一个的类的对象多用类这个同一把锁。

阅读 3.7k
2 个回答
结论:竞争的是this指向的实例。

例子1

只有一个MyRunnable实例,因此t1和t2竞争同一个锁
class MyRunnable implements Runnable {
    @Override
    public void run() {
        synchronized(this) {
        }
    }
}

public class main(String[] args) {
    MyRunnable r = new MyRunnable();
    Thread t1 = new Thread(r);
    Thread t2 = new Thread(r); 
    t1.start();
    t2.start();
} 

例子2

有2个MyRunnable实例,因此t1和t2之间没有竞争
class MyRunnable implements Runnable {
    @Override
    public void run() {
        synchronized(this) {
        }
    }
}

public class main(String[] args) {
    MyRunnable r1 = new MyRunnable();
    MyRunnable r2 = new MyRunnable();
    Thread t1 = new Thread(r1);
    Thread t2 = new Thread(r2); 
    t1.start();
    t2.start();
} 

例子3

有2个MyRunnable实例,但是锁定的是class对象,所有MyRunnable实例的对象类只有一个,因此t1和t2竞争同一把锁
class MyRunnable implements Runnable {
    @Override
    public void run() {
        synchronized(MyRunnable.class) {
        }
    }
}

public class main(String[] args) {
    MyRunnable r1 = new MyRunnable();
    MyRunnable r2 = new MyRunnable();
    Thread t1 = new Thread(r1);
    Thread t2 = new Thread(r2); 
    t1.start();
    t2.start();
} 

这位兄弟,你读一下你的描述看能读得通不

然后 this 做锁表示用类的对象做锁,不同的对象是不同的锁,锁不住的,
但如果是在 spring component 中使用,因为 component 默认是单例的,只会有一个对象,所以加锁是成功的,
但还有一种情况,如果是在事务中使用,因为锁代码块未包含整个事务提交的代码,所以锁会失效

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题