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
答案 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()
方法时,它会在对象上获得一个锁(互斥锁)。然后它执行方法体内的代码(即循环和打印语句)。最后,它释放对象的锁定以允许另一个等待执行该方法的线程。因此,您始终可以看到打印语句以段为单位出现。