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

发布于 2022-09-12 01:26:58 字数 131 浏览 22 评论 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

鲜肉鲜肉永远不皱 2022-09-19 01:26:58

结论:竞争的是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();
} 
浅语花开 2022-09-19 01:26:58

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文