gpt4 book ai didi

Java 8.线程同步问题

转载 作者:行者123 更新时间:2023-12-02 10:03:15 24 4
gpt4 key购买 nike

我有三个对象:A、B 和 C。我需要这样的同步,以便与对象A和B同步的 block 可以并行执行,并且当执行与对象A同步的 block 或与对象B同步的 block 时,无法执行与对象C同步的 block 。并且当执行与对象C 同步的 block 时,无法执行与对象A 和B 同步的 block 。我尝试使用对象 C 作为列表,将对象 A 和 B 作为存储在该列表中的对象,但它不起作用。请告诉我,是否可以以某种方式配置此类同步?

import java.util.ArrayList;
import java.util.List;

public class Threads {
public List<Res> lst = new ArrayList();

public void startThreads(){
lst.add(new Res());
lst.add(new Res());
Thread t1 = new Thread(new work1());
Thread t2 = new Thread(new work2());
Thread t3 = new Thread(new work3());
t1.start();
t2.start();
t3.start();
}
public class work1 implements Runnable {
@Override
public void run() {
Method1();
}
}
public class work2 implements Runnable {
@Override
public void run() {
Method2();
}
}

public class work3 implements Runnable {
@Override
public void run() {
Method3();
}
}

public void Method1(){
synchronized (lst.get(0)/*obj A*/){
//some work
}
}

public void Method2(){
synchronized (lst.get(1)/*obj B*/){
//some work
}
}

public void Method3(){
synchronized (lst)/*obj C*/{
//some work
}
}
}

类资源:

public class Res {
public int number = 0;
}

主类:

public class Main {
public static void main(String[] args) throws InterruptedException {
Threads t = new Threads();
t.startThreads();
}
}

最佳答案

在您的情况下,最简单(不推荐)的解决方案是使用不同的监视对象保护 block A 和 block B,并使用 A 和 B 的监视对象保护 block C。

public void Method1(){
synchronized (A){
//some work
}
}

public void Method2(){
synchronized (B){
//some work
}
}

public void Method3(){
synchronized (A){
synchronized (B){
//some work
}
}
}

同样可以使用Locks来完成也是如此。

public void Method1(){
lockA.lock();
try{
//some work
} finally {
lockA.unlock();
}
}

public void Method2(){
lockB.lock();
try{
//some work
} finally {
lockB.unlock();
}
}

public void Method3(){
lockA.lock();
try{
lockB.lock();
try{
//some work
} finally {
lockB.unlock();
}
} finally {
lockA.unlock();
}
}

或者您可以按照 shmosel 在评论中的建议使用读/写锁。

public void Method1(){
readWriteLock.readLock().lock();
try{
//some work
} finally {
readWriteLock.readLock().unlock();
}
}

public void Method2(){
readWriteLock.readLock().lock();
try{
//some work
} finally {
readWriteLock.readLock().unlock();
}
}

public void Method3(){
readWriteLock.writeLock().lock();
try{
//some work
} finally {
readWriteLock.writeLock().unlock();
}
}

您还可以使用 CountDownLatch出于同样的目的,尽管读/写锁是最简单的。

关于Java 8.线程同步问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55483081/

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