当前位置: 首页 > 面试题库 >

语句执行与同步方法执行交织

东门楚
2023-03-14
问题内容

我在理解同步关键字功能时遇到了一些麻烦。根据Java文档和其他教程,可以说,当使用synced关键字时,在两个线程之间不可能在该方法的语句之间进行交织。

但是,请参见下面的代码。

public class LockThread implements Runnable {
     String name;
     public LockThread(String name) {
          this.name = name;
     }
     public static void main(String[] args) {
          new Thread(new LockThread("a")).start();
          new Thread(new LockThread("b")).start();
     }
     public void run() {
          locked(Thread.currentThread().getId());


     }

 synchronized void locked(long l) {
      System.out.println(name+"-"+l +  "---> Printed from "   + Thread.currentThread().getName());
      System.out.println(name+"-"+l +  "---> Printed from "   + Thread.currentThread().getName());
 }

}

据我了解,程序输出应始终以线程0和线程1不应交错的方式进行。但是多次执行这段代码后,我得到了交错输出。

    带交错(我期望输出)
    a-9 --->从Thread-0打印
    a-9 --->从Thread-0打印
    b-10 --->从线程1打印
    b-10 --->从线程1打印

没有交错(这是上面相同代码的另一个输出)
    a-9 --->从Thread-0打印
    b-10 --->从线程1打印
    a-9 --->从Thread-0打印
    b-10 --->从线程1打印

请帮助我理解问题。

提前致谢..


问题答案:

synchronized关键字防止两个线程运行的是在同一对象上同步代码。

您的每个线程都在不同的对象(this)上进行同步,因此无效。



 类似资料:
  • 一旦遇到这样的问题,这里还有更多内容,然后发现了 一个适当恶劣的解决方法。 这篇文章没有列在索引中,但是为满足你的好奇心而保留了下来。

  • 问题内容: 我在Hibernate尝试了简单的程序,并发现了一堆异常。 我不知道到底是什么问题。 我有三个课程-书籍,阅读器和使用。最后一个是将前两个绑定为一对多。 这是我的: 这是异常消息: 的摘要: DB上的所有表均已创建,但为空。一切都还好。有什么建议么? 如何解决这个麻烦? 问题答案: 在MySQL中, USING 是保留字。 因此,只需使用实体上的注释来重命名表即可。就像是 我假设您有一

  • 我得到以下错误,当我尝试添加一个应用程序和应用程序设置。以下是详细的错误消息: 下面是junit测试 这是保存应用程序和设置的方法 这些是DAO类。 这是应用刀 为什么我会得到上面的错误?如果你们需要更多的信息,请告诉我。 更新

  • 问题内容: 我有4种方法(,,和一类)。方法,并有方法。另外,我有4个线程,,和分别。 如果访问方法(同步方法),线程访问方法(同步方法)是否可以同时进行?如果不是,则t2的状态如何? 问题答案: 如果t1访问m1方法(同步方法),t2线程可以同时访问m2方法(同步方法)吗? 该关键字适用于 目标水平 ,且只有一个线程可持有对象的锁。因此,只要您在谈论同一个对象,那么 否 ,它将等待释放进入时获得

  • 问题内容: 我的任务是按以下顺序创建线程:如果A开始->启动B和C,如果B开始->启动D。并以相反的顺序销毁它们如果D然后B。如果B和C然后A。它。我设法做到了,但我想还有更好的方法。你有什么建议吗? 在您发表评论后,我更改了代码,这非常简单。但是现在看起来“愚蠢”。我想更改if语句和实现的硬性,有什么建议吗?寻求建议,我正在与您一起学习。 这是我的新代码: 问题答案: 您的代码中存在一些缺陷,这