为什么我的多线程执行是单线程模式

时间:2016-01-05 04:00:15

标签: java multithreading

package indi.JavaLearn;

public class MultiThread {
    private static int shared;
    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            (new Thread() {
                public void run() {
                    write2();
                }
            }).start();
        }
    }
    public synchronized static void write2() {
        int i = 0;
        while (i < 2) {
            shared++;
            System.out.println("write," + Thread.currentThread().getId() + "," + String.valueOf(shared));
            i++;
        }
    }
}

结果

write,12,1
write,12,2
write,15,3
write,15,4
write,16,5
write,16,6
write,14,7
write,14,8
write,13,9
write,13,10

3 个答案:

答案 0 :(得分:1)

write2中的synchronized修饰符允许该方法一次只能由一个线程运行 - 您需要将其删除才能在多个线程上同时运行。

如果你真正想要做的是锁定共享变量,请使用synchronized块:

synchronized(shared){
  shared++;
  System.out.println("write," + Thread.currentThread().getId() + "," + String.valueOf(shared));
}

答案 1 :(得分:1)

public synchronized static void write2()是一种静态同步方法,意味着锁定/监视器维持在Class级而不是Object级别。

synchronized对象上的静态同步方法为Class。如果一个线程正在执行static synchronized方法,则除非锁定线程释放锁,否则将阻止尝试执行任何static synchronized方法的所有其他线程。

非静态同步方法在this上同步(表示Object,它是类的一个实例)。如果一个线程正在执行synchronized方法,则将阻止尝试执行任何synchronized方法on that Object (but not the class)的所有其他线程。

查看相关的SE问题:

Static versus non-static lock object in synchronized block

What is the difference between synchronized and static synchronized?

您可以在此link

找到有关这些概念的详细文档
  

您可能想知道在调用静态同步方法时会发生什么,因为静态方法与类相关联,而不是与对象相关联。在这种情况下,线程获取与该类关联的Class对象的内部锁。因此,对类的静态字段的访问由与该类的任何实例的锁不同的锁控制。

答案 2 :(得分:0)

您应该阅读Java中的并发性,特别是synchronized关键字的含义。

现在,关于你的代码发生了什么......

当一个线程(例如ID为12的线程)调用write2()方法时,它会在对象上获得一个锁(互斥锁)。然后它执行方法体内的代码(即循环和打印语句)。最后,它释放对象的锁定以允许另一个等待执行该方法的线程。因此,您始终可以看到打印语句以段为单位出现。