同步代码 [重复]

Posted

技术标签:

【中文标题】同步代码 [重复]【英文标题】:Synchronized Code [duplicate] 【发布时间】:2013-01-28 04:39:34 【问题描述】:

我在某处读到以下代码片段在同步代码方面是等效的:

public synchronized void printMsg() 
    System.out.println("synchronized");



public void printMsg() 
    synchronized(this) 
        System.out.println("synchronized");
    

据我所知,当线程访问对象上的同步方法时,其非同步方法不会被锁定,即其他线程可以使用相同的实例访问它们。

观察第二个片段,我的印象是,由于代码在this 上同步,因此访问该代码的线程会获取对象上的锁。

我的问题是,当 Thraed 使用第二个 code-sn-p 维护执行方法 printMsg() 的锁时,其他线程是否可以访问其他类方法?

如果不是,则上述方法不完全相同。什么是真的?

【问题讨论】:

这些都不是重复的,尤其不是第一个,只是把问题读得更好 相关:***.com/questions/4394976/… printMsg() 代码片段锁定 this 并且功能相同。他们都锁定this。线程阻塞的唯一时间是调用synchronized。仅在 this 上同步并不会阻止其他线程调用(例如)未同步的 toString() 方法。 【参考方案1】:

您的第一个方法隐式获取this 上的锁,因此它与您的第二个方法相同。

任何其他未同步的方法,或在方法主体中的this 上同步的任何其他方法都不会尝试锁定对象,并且可以由其他线程并发运行。

【讨论】:

更准确的说法是它们在功能上是等效的而不是相同的。【参考方案2】:

上述方法是相同的。一个线程不需要在对象上获取锁来访问它的方法,除非它们被标记为 synchronized 关键字 - 因此,所有其他线程都会执行这些方法,即使有一个线程持有 synchronized (this) 锁。

【讨论】:

以上是关于同步代码 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能将异步代码作为同步运行 [重复]

JavaScript:使用 await 使 asnyc 代码看起来更同步 [重复]

对象同步,java [重复]

java同步(this)范围[重复]

这段代码在做啥[重复]

什么?同步代码块失效了?-- 自定义类加载器引起的问题