如下代码是否正确?
class RunnerA implements Runnable {
private list list;
private buffer buffer;
///重写run
public void run() {
synchronized(list) {
//操作 list
}
synchronized(list) {
//操作 buffer
}
synchronized(list) {
synchronized(list) {
//操作 buffer 和 buffer
}
}
}
..........
setter
getter
}
class RunnerB implements Runnable {
private RunnerA a;
public RunnerB (RunnerA a) {
this.a = a;
}
///重写run
public void run() {
synchronized(list) {
synchronized(list) {
//操作 buffer 和 buffer
a.getter
a.setter
}
}
}
..........
setter
getter
}
//main 函数
{
//线程池
ExecutorService executorA = Executors.newCachedThreadPool();
ExecutorService executorB = Executors.newCachedThreadPool();
for(int i = 0;i < 3; i++) {
RunnerA a = new RunnerA();
executorA.submit(a);
executorB.submit(new RunnerB(a));
}
}
也就是一共三组线程
每一组由一个RunnerA 和 RunnerB,且每组的RunnerB可以操作RunnerA 中的变量
这样是否能保证,list和buffer线程安全?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
肯定是可以的,和你用的executorservice没关系。
你这里锁对象没给清楚啊……
这么说吧,如果你锁的是同一个东西,那么之后的代码段就是同步的,必须等一段执行完才能执行另一段。所以在 B 里你可以通过
synchrnized(a.list)
来锁。但是建议不要这么干,直接由 A 提供对 list 和 buffer 的操作,在 A 类中进行同步处理,不要把这个权限放到外面给别的类来干,因为你不知道出了A之后,使用 A 的类会不会去实现同步机制。