gpt4 book ai didi

java - ReentrantLock 不起作用

转载 作者:行者123 更新时间:2023-11-29 07:41:52 25 4
gpt4 key购买 nike

我不明白为什么代码不能正常工作。问题是 ReentrantLock 没有锁定 ThreadClass.run() 中的方法调用

Resource-class哪些方法被假定为在ThreadClass中被锁定

public class ResourceClass {

private int i;

public void setIncrement() {
i++;
}

public int getIncrement() {
return i;
}

}

线程类

public class ThreadClass implements Runnable {

private ResourceClass resource;
private ReentrantLock reentrantLock = new ReentrantLock();

ThreadClass(ResourceClass r) {
resource = r;
}

public void run() {
reentrantLock.lock();
try {
resource.setIncrement();
System.out.println(resource.getIncrement());
} finally {
reentrantLock.unlock();
}
}

}

主类

public class MainClass {

public static void main(String[] args) {

ResourceClass resource = new ResourceClass();

Thread thread = new Thread(new ThreadClass(resource));
thread.start();
Thread thread2 = new Thread(new ThreadClass(resource));
thread2.start();
Thread thread3 = new Thread(new ThreadClass(resource));
thread3.start();
}

}

假设 run() 中被锁包围的代码必须是“同步的”,因此只有一个线程可以访问资源对象的方法。在实践中它没有。代码结果重复数字,这意味着两个线程可以同时访问这些方法。我知道这是一个非常简单的问题,但我不明白如何解决它。感谢您的帮助。

更新:

我明白了。那段代码工作得很好(我删除了 setIncrement() 并将所有相关逻辑放入 getIncrement() 中):

public int getIncrement() {
reentrantLock.lock();
int incrementResult = i++;
reentrantLock.unlock();
return incrementResult;
}

最佳答案

您正在为每个可运行对象创建一个新的 ReentrantLock,这意味着没有同步。您需要与每个 Runnable 实例共享一把锁。

关于java - ReentrantLock 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29259240/

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