同步代码 [重复]
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)
锁。
【讨论】:
以上是关于同步代码 [重复]的主要内容,如果未能解决你的问题,请参考以下文章