我使用“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”循环。然而,打印的结果并不符合我的预期。
谁能帮我指出我的问题是什么?谢谢~
最佳答案
这是因为您同步
对当前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/