java - 为什么 synchronized 不能正常工作?

标签 java multithreading synchronized

这是我的代码:

private int count = 0;

  public synchronized void increment() {
      count++;
  }

 public void doWork() throws InterruptedException {

    Thread t1 = new Thread(new Runnable() {
        public void run() {
            for (int i = 0; i < 5; i++) {
                increment();
                System.out.println(count+"  "+Thread.currentThread().getName());
            }}});

    Thread t2 = new Thread(new Runnable() {
        public void run() {
            for (int i = 0; i < 5; i++) {
                increment();
                System.out.println(count+"  "+Thread.currentThread().getName());
            }}});

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

这是我的输出:

2  Thread-1
2  Thread-0
3  Thread-1
5  Thread-1
6  Thread-1
4  Thread-0
8  Thread-0
9  Thread-0
7  Thread-1
10  Thread-0

我的理解是incrementsynchronized。所以,它应该首先递增一个数字,然后释放,然后将交给线程t1t2。所以,它应该一次递增一个数字,对吗?

但为什么我的代码一次递增两个或三个数字?我做错了什么吗(我是新手)?

最佳答案

虽然 count++; 确实是同步的 System.out.println(count+""+Thread.currentThread().getName()); 不是,但是它访问到 count 变量。

即使您同步访问,也无济于事,因为下一种情况仍然可能发生:

  • 线程 1 增量
  • 线程 2 增量
  • 线程 1 打印值 2
  • 线程 2 打印值 2

要解决此问题,您需要在同一同步部分中递增和打印。例如,您可以将 System.out.println(count+""+Thread.currentThread().getName()); 放入 increment 方法中。

关于java - 为什么 synchronized 不能正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39748960/

相关文章:

java - 访问对象 Y 上定义的同步块(synchronized block)内的对象 X 是否安全?

java - 访问二维数组中的对象中的方法时出现 NullPointerException

java - 如何将 2 个或多个值放入 ArrayList<NameValuePair>

android - 无法在工作线程上同步获取 firebase id token

java - 发布自定义事件并在基于 Spring MVC 的 Rest 应用程序中异步处理它

java - StringBuffer 与 StringBuilder

java - 尝试将生成的输入流与资源文件进行比较 - jUnit

java - 具有约束的 Java 中的并发请求处理

C# 从循环中启动线程抛出 IndexOutOfBoundsException

Java 静态 Synchronized 与 BlockingQueue 实现