java - for循环生成的多线程不能使用synchronized吗?

标签 java multithreading

我使用“for”循环生成100个线程,打印出数据0~4。

public class ThreadTest implements Runnable {
    static volatile int threadNum = 100;
    public void run() {
        synchronized (this) {
            for (int i = 0; i < 5; i++) {
                System.out.println(Thread.currentThread().getName() + " synchronized loop " + i);
            }
        }
    }

    public static void main(String[] args) {
        for (int i = 0; i < threadNum; i++) {
            ThreadTest t = new ThreadTest();
            Thread t1 = new Thread(t);
            t1.start();
        }
    }
}

我曾经希望每个线程都能按顺序拿到数据0~4,因为“同步”只允许一个线程操作“for”循环。然而,打印的结果并不符合我的预期。

enter image description here

谁能帮我指出我的问题是什么?谢谢~

最佳答案

这是因为您同步对当前ThreadTest实例的访问(使用synchronized (this)),并且每个实例都有一个这样的实例线程,因此它是无用的,您应该在像类这样的公共(public)互斥体上进行同步,例如,因为我们只有一个类实例作为下一个:

synchronized (ThreadTest.class) {
    for (int i = 0; i < 5; i++) {
        System.out.println(Thread.currentThread().getName() + " synchronized loop " + i);
    }
}

关于java - for循环生成的多线程不能使用synchronized吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37874839/

相关文章:

java - HystrixCommand 和 HystrixObservableCommand 的区别

java - 让camel使用Map构建端点uri

java - 为什么 Executor Service Implementation 的 Pool count 会增加?

java - 为什么多线程 Java 程序在 'super' Linux 服务器上没有比笔记本电脑 Win7 更快?

c++ - SwapBuffers 随着时间的推移变慢

java - 在 Java 中移动 Math.ceil

java - 领域对象的集合 - 组合与继承

java - 为什么从其他 Jframe 中的另一个面板设置 Jframe 中的面板内容不起作用?

c# - 在不同的线程工作时刷新页面

c - 如何在不使用 POSIX 库 <pthread.h> 的情况下在 C 中创建线程