我很好奇如果代码看起来像下面会发生什么。这是否意味着每个创建的线程中的每个对象都是同步的?
public synchronized void go() {
try {
while(true) {
//waiting for a new connection
new Thread(client).start();
}
} catch (IOException e) {
}
}
答案 0 :(得分:0)
这是否意味着每个创建的线程中的每个操作都已同步?
没有。新线程上的start
方法在启动新线程后立即返回。然后调用线程退出synchronized方法,因此释放同步锁。
编辑:我发现您已编辑了问题以添加while (1)
循环。我认为你的意思是while (true)
BTW。这改变了我的解释,因为调用线程永远不会离开synchronized方法。但答案仍然是否定的。正如Thilo在下面的评论中指出的那样,新线程与该锁无关。
调用线程拥有synchronized块创建的锁。只要该线程在该块的范围内执行代码 ,它就会保留锁定,因此没有其他线程可以进入该块。在您的示例中,将创建一个新的线程对象并调用start
方法。此方法通过调用在新线程上下文中执行的run
方法来开始执行线程。因为它是一个新的线程上下文,所以它被认为是在调用线程的synchronized块的范围之外。因此,新线程不会被阻止,默认情况下新线程也不包含任何同步代码块。
答案 1 :(得分:0)
如果方法是同步调用,则将同步操作。如果该方法是异步调用,则不会同步操作。
在上面的例子中,start方法是异步的,动作不会同步。