gpt4 book ai didi

java - 这个java程序中存在多线程冲突。怎么解释呢?

转载 作者:行者123 更新时间:2023-12-01 19:40:09 24 4
gpt4 key购买 nike

我的程序是:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class test implements Runnable{
private static int i;
private static volatile Integer vi = 0;
private static AtomicInteger ai = new AtomicInteger();
private static Integer si = 0;
private static int ri;
private static AtomicInteger flag = new AtomicInteger();
private Lock lock = new ReentrantLock();
@Override
public void run() {
for(int k=0;k<200000;k++){
i++;
vi++;
ai.incrementAndGet();
synchronized (si){
si++;
}
lock.lock();
try{
ri++;
}finally {
lock.unlock();
}
}
flag.incrementAndGet();
}
public static void main(String[] args) throws InterruptedException{
test t1 = new test();
test t2 = new test();
ExecutorService exec1 = Executors.newCachedThreadPool();
ExecutorService exec2 = Executors.newCachedThreadPool();
exec1.execute(t1);
exec1.execute(t2);
while(true){
if(flag.intValue()==2){
System.out.println("i>>>>>>"+i);
System.out.println("vi>>>>>>"+vi);
System.out.println("ai>>>>>>"+ai);
System.out.println("si>>>>>>"+si);
System.out.println("ri>>>>>>"+ri);
break;
}
Thread.sleep(50);
}
}
}

结果是:

vi>>>>>>340217
ai>>>>>>400000
si>>>>>>364359
ri>>>>>>397043

有人可以帮忙解释一下这个多线程程序是如何工作的吗?结果表明 vi 不等于 400000,这是相当合理的。但为什么si和ri不等于400000呢?si是同步的,ri是通过锁同步的。

最佳答案

您没有同步对主线程中变量的访问。

您需要围绕变量进行相同的同步/锁定,以保证更新的可见性。

但是,您在 si 上的同步可能无法按您的预期工作,因为您不断向该字段分配新值:synchronized on test.改为类

类似地,lock 授予的同步可能无法按您的预期工作,因为每个 test 实例都有自己的锁。

关于java - 这个java程序中存在多线程冲突。怎么解释呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55629392/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com