Java 为什么不同步?
关于Java synchronized,我尝试了一个示例(来自TLF-SOFT-VTC.Java.6CFE),但结果是错误的,为什么不同步呢?守则:Java 为什么不同步?,java,synchronized,Java,Synchronized,关于Java synchronized,我尝试了一个示例(来自TLF-SOFT-VTC.Java.6CFE),但结果是错误的,为什么不同步呢?守则: public class InterferenceFix extends Thread { String name; static boolean isZero = true; static int counter = 0; public static void main(String arg[]) {
public class InterferenceFix extends Thread {
String name;
static boolean isZero = true;
static int counter = 0;
public static void main(String arg[]) {
InterferenceFix one = new InterferenceFix("one");
InterferenceFix two = new InterferenceFix("two");
one.start();
two.start();
}
InterferenceFix(String nameString) {
name = nameString;
}
public void run() {
for (int i = 0; i < 100000; i++) {
update();
}
System.out.println(name + ": " + counter);
}
synchronized void update() {
if (isZero) {
isZero = false;
counter++;
} else {
isZero = true;
counter--;
}
}
}
public类InterferenceFix扩展线程{
字符串名;
静态布尔值为零=真;
静态整数计数器=0;
公共静态void main(字符串arg[]){
InterferenceFix one=新的InterferenceFix(“一”);
InterferenceFix two=新的InterferenceFix(“two”);
一、启动();
二、启动();
}
干扰修复(字符串名称字符串){
name=名称字符串;
}
公开募捐{
对于(int i=0;i<100000;i++){
更新();
}
System.out.println(name+“:”+计数器);
}
同步的无效更新(){
如果(为零){
isZero=假;
计数器++;
}否则{
isZero=真;
计数器--;
}
}
}
只有更新
方法是同步的,这意味着循环可以在两个线程上同时运行,只有更新
本身不能
另外,synchronized
关键字实际上锁定了对象this
,在您的例子中,我们讨论了两个不同的实例,这意味着它们锁定了不同的this
。这意味着,主动线程不会以任何方式干扰彼此的工作,它们可以同时运行
如果这确实是您想要的,那么您最好创建一个静态锁:
private static final Object lock = new lock();
并将更新(或运行)更改为:
如果您需要同步for循环,只需在循环周围以相同的方式使用锁,而不是在实例方法上的
update
synchronized
只对每个实例的调用进行序列化,而静态方法上的synchronized
会对每个类进行序列化,因此对所有调用都是如此。所以它们有不同的锁对象。现在大家可以猜到,可以使用静态同步
方法来修改这些静态字段。一定要用@Override
注释标记run()
。另外:每天使用牙线,过马路前要查看两边。update()
也可以在两个线程上同时运行;没有什么可以阻止它们,因为两个线程正在不同的对象上同步。谢谢大家,根据你们所说的,我在update()方法之前添加了一个“static”,它可以工作。
void update() {
synchronized (lock) {
if (isZero) {
isZero = false;
counter++;
} else {
isZero = true;
counter--;
}
}
}