线程外的同步

时间:2016-01-28 03:30:14

标签: java multithreading synchronization

我很好奇如果代码看起来像下面会发生什么。这是否意味着每个创建的线程中的每个对象都是同步的?

public synchronized void go() {
    try {
        while(true) {
            //waiting for a new connection
            new Thread(client).start(); 
        }
    } catch (IOException e) {
    }
}

2 个答案:

答案 0 :(得分:0)

  

这是否意味着每个创建的线程中的每个操作都已同步?

没有。新线程上的start方法在启动新线程后立即返回。然后调用线程退出synchronized方法,因此释放同步锁。

编辑:我发现您已编辑了问题以添加while (1)循环。我认为你的意思是while (true) BTW。这改变了我的解释,因为调用线程永远不会离开synchronized方法。但答案仍然是否定的。正如Thilo在下面的评论中指出的那样,新线程与该锁无关。

调用线程拥有synchronized块创建的锁。只要该线程在该块的范围内执行代码 ,它就会保留锁定,因此没有其他线程可以进入该块。在您的示例中,将创建一个新的线程对象并调用start方法。此方法通过调用在新线程上下文中执行的run方法来开始执行线程。因为它是一个新的线程上下文,所以它被认为是在调用线程的synchronized块的范围之外。因此,新线程不会被阻止,默认情况下新线程也不包含任何同步代码块。

答案 1 :(得分:0)

如果方法是同步调用,则将同步操作。如果该方法是异步调用,则不会同步操作。

在上面的例子中,start方法是异步的,动作不会同步。