java - 同步方法未按预期工作

标签 java multithreading

public class TestCases implements Serializable{

public TestCases() {
    // TODO Auto-generated constructor stub
}

public static void main(String[] args) {
    // TODO Auto-generated method stub
    Santhosh me = new Santhosh();
    MyThread myT1 = new MyThread(me);
    MyThread myT2 = new MyThread(me);

    Thread t1 = new Thread(myT1);
    Thread t2 = new Thread(myT2);

    t1.setName("one");
    t2.setName("two");

    t1.start();
    t2.start();

   }
 }

这个类的对象将被两个线程访问

public class Santhosh {

private String name=null;

public void setName(String name){
    synchronized(this){
    System.out.println("changing name by "+Thread.currentThread().getName());
    this.name = name;
    }
  }
}

我的线程类

public class MyThread implements Runnable{

private Santhosh santhu;

public MyThread(Santhosh me){
    this.santhu = me;
}

public void run(){
    for(int i=0;i<1000;i++){
        this.santhu.setName(Thread.currentThread().getName());
    }
  }

}

我期望结果是这样的:

changing name by one
changing name by one
changing name by one
.
.
.
(1000 times)

changing name by two
changing name by two
.
.
.
(1000 times)

我知道顺序可能不同,即“更改名称两次”可能会先出现(1000 次),然后“更改名称一位”(1000 次)

但是当我运行这段代码时,我看到这样的东西:

changing name by one
changing name by one
changing name by two
changing name by two
changing name by two
changing name by two
changing name by two
changing name by two
changing name by two
changing name by two
changing name by two
changing name by two
changing name by two
changing name by one --- ONE here
changing name by two

最佳答案

在你的情况下是 thread输入 synchronized block ,执行它并将其保留在每次迭代中。一次Thread离开synchronized阻止它为另一个竞争者留下了机会thread获取lock并输入synchronized block 。

为了获得您期望的结果,您可以修改类 MyThreadrun()方法如下。

public void run(){
    synchronized(me){
          for(int i=0;i<1000;i++){
            this.santhu.setName(Thread.currentThread().getName());
          }
    }
  }

此外,如果您按照上述方式操作,则可以删除 synchronized来自SanthoshsetName()方法。

附注虽然你应该保留正确的上下文名称,但我理解这里只是为了学习的目的,但我仍然建议重命名该类 MyThreadMyRunnable作为 Runnable 的实现接口(interface),它不是 Thread .

关于java - 同步方法未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43555917/

相关文章:

java - 错误 - 返回 JSON 以及 HTTP 状态代码错误 JAX-RS

java - hamcrest "hasItem"可以获得几个匹配器吗?

java 对从文本文件中读取的字符串进行标记化

java - 并发收集先发生关系

c++ - 如何在使用 C++11 线程模型或 tbb 线程类时取消特定线程?

java - Tapestry Hibernate session 超出 ExecutorService 固定线程池后关闭

C# 杀死所有线程

java - 为什么当我增加最大堆大小时最大线程数会减少?

c++ - 从单个工作线程更新全局变量 : Do I need mutexes?

java - 什么是对 LinkedList 内部元素的(缓慢)访问