2016-06-17 58 views
0

我使用“for”循环生成100个线程来打印出数据0〜4。For循环生成的多线程不能使用同步?

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

谁能帮我指向我们我的问题是什么?谢谢〜

+4

提示:避免张贴屏幕截图。你的输出是“纯文本”;所以你简单地复制/粘贴该文本会容易得多。 – GhostCat

回答

3

这是因为你synchronize对当前ThreadTest实例的访问(使用synchronized (this)),你必须每个线程一个这样的实例,以便它是无用的,则应该像类例如作为普通互斥同步我们只有一个类的例子作为下一个:

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

根据您的建议修改我的代码后,问题就解决了。谢谢! –

1

一切都在这里预计。

问题是:您的每个ThreadTest对象都在其这个指针上同步。

当你给100人100匙和100碗,并告诉他们开始吃东西时,你希望发生什么?也许,如果你一共只有一把勺子给100人,那会改变什么吗?

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