java 多线程对象锁数据同步问题

如下代码是否正确?

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线程安全?

阅读 3.3k
2 个回答

肯定是可以的,和你用的executorservice没关系。

你这里锁对象没给清楚啊……

这么说吧,如果你锁的是同一个东西,那么之后的代码段就是同步的,必须等一段执行完才能执行另一段。所以在 B 里你可以通过 synchrnized(a.list) 来锁。

但是建议不要这么干,直接由 A 提供对 list 和 buffer 的操作,在 A 类中进行同步处理,不要把这个权限放到外面给别的类来干,因为你不知道出了A之后,使用 A 的类会不会去实现同步机制。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题