对于循环生成的多线程不能使用synchronized?

时间:2016-06-17 06:45:40

标签: 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,因为“synchronized”只允许一个线程操作“for”循环。但是,打印结果并不像我预期的那样。

enter image description here

任何人都可以帮助我指出我的问题是什么吗?谢谢〜

2 个答案:

答案 0 :(得分:3)

这是因为您synchronize对当前ThreadTest实例的访问权限(使用synchronized (this))并且每个线程都有一个这样的实例,因此它没用,您应该在例如类的常见互斥,因为我们只有一个类的实例作为下一个:

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

答案 1 :(得分:1)

这里预期的一切。

事情是:你的每个ThreadTest对象都在其这个指针上进行同步。

当你给100个人100汤匙和100碗并告诉他们开始进食时,你会发生什么?也许,如果100个人只有1勺,那会改变什么吗?

长话短说:您必须同步一个对象,而不是100个不同的对象。