gpt4 book ai didi

java - 如何使用可重入锁实现三个线程的同步?

转载 作者:行者123 更新时间:2023-12-02 12:39:59 25 4
gpt4 key购买 nike

下面指定的代码片段使用wait()和notify()方法同步三个线程,按顺序打印数字。但要求是使用可重入锁定机制来实现相同的目的。

class JoinTask {

private int currentRank = 1;

public void doJob(int rank, int printNo) {
synchronized (this) {
while (rank != currentRank) {
try {
System.out.println("going to wait by thread:" + printNo);
wait();
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
System.out.println("Job:" + printNo + " : " + currentRank);
currentRank++;
notifyAll();
}
}
}

public class ThreeThreadsPlay {

public static void main(String[] args) {
final JoinTask task = new JoinTask();

Thread A = new Thread() {
public void run() {
int k = 1;
for (int i = 1; i < 30; i++) {
task.doJob(k, 1);
k = k + 3;
}}};

Thread B = new Thread() {
public void run() {
int k = 2;
for (int i = 1; i < 30; i++) {
task.doJob(k, 2);
k = k + 3;
}}};

Thread C = new Thread() {
public void run() {
int k = 3;
for (int i = 1; i < 30; i++) {
task.doJob(k, 3);
k = k + 3;
}}};
C.start();
B.start();
A.start();
}}

如何使用可重入锁定实现相同的目的?

使用可重入锁定来提供此类机制的任何其他示例也会有所帮助。此外,在此背景下提供的任何信息都将受到高度赞赏。

最佳答案

这是使用ReentrantLock/Conditional的正确实现。仔细注意这与您尝试的之间的差异。锁的获取和释放实际上应该在 try-finally block 中处理,以避免无限期地保留锁,但您可以在其他问题中找到相关示例。

class JoinTask {

private int currentRank = 1;
final ReentrantLock l = new ReentrantLock();
final Condition c = l.newCondition();

public void doJob(int rank, int threadNumber) {
l.lock();
while(rank != currentRank) {
c.await();
}
System.out.println("Job:" + threadNumber + " : " + currentRank);
currentRank++;
c.signalAll();
l.unlock();
}
}

关于java - 如何使用可重入锁实现三个线程的同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44985616/

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