首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我对同步块的假设正确吗?

我对同步块的假设正确吗?
EN

Stack Overflow用户
提问于 2010-05-03 11:27:29
回答 3查看 340关注 0票数 1

我有一个带有synchronized块的shout()方法。

代码语言:javascript
运行
复制
  private void shout(){
    System.out.println("SHOUT " + Thread.currentThread().getName());
    synchronized(this){
      System.out.println("Synchronized Shout"  + Thread.currentThread().getName());
      try {
        Thread.sleep(50);
      }
      catch (InterruptedException e) {
        e.printStackTrace();
      }
      System.out.println("Synchronized Shout"  + Thread.currentThread().getName());
     }
  }

如果我有两个线程运行这个方法,我假设两个“同步的喊叫”总是一个接一个出现,对吗?在"Synchronized Shout“之间不能有其他语句?

EN

回答 3

Stack Overflow用户

发布于 2010-05-03 11:41:15

只要this引用是相同的。如果在两个不同的对象上运行代码,锁将不起作用。

请注意,如果您在this上使用Object.wait而不是调用Thread.sleep来延迟,那么锁将被移除(并在继续之前重新获得)。

票数 2
EN

Stack Overflow用户

发布于 2010-05-03 12:17:25

因为打印“呼喊...”的那行不需要锁,它可以出现在任何地方。因此,即使一个线程持有锁,另一个线程也可能进入并打印"SHOUT...“。

下面的代码显示了交错:

代码语言:javascript
运行
复制
public class Interleave {
  public static void main(String[] args) throws Throwable {
    Task task = new Task();
    Thread t1 = new Thread(task);
    Thread t2 = new Thread(task);
    t1.start();
    Thread.sleep(25);
    t2.start();
  }

  private static class Task implements Runnable {
    public void run() {
      shout();
    }

    private void shout() {
      System.out.println("SHOUT " + Thread.currentThread().getName());
      synchronized (this) {
        System.out.println("Synchronized Shout "  + Thread.currentThread().getName());
        try {
          Thread.sleep(50);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
        System.out.println("Synchronized Shout "  + Thread.currentThread().getName());
      }
    }
  }
}

它会打印出来

代码语言:javascript
运行
复制
SHOUT Thread-0
Synchronized Shout Thread-0
SHOUT Thread-1
Synchronized Shout Thread-0
Synchronized Shout Thread-1
Synchronized Shout Thread-1
票数 2
EN

Stack Overflow用户

发布于 2010-05-04 09:46:00

当两个或多个线程在同一个实例上运行时,SHOUT可以出现在任何地方,因为它在synchronized块之外,因此不受保护。“同步的呼喊”将始终严格按顺序出现,没有来自另一个线程的同步呼喊介入并影响顺序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2755969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档