java 多线程对象锁数据同步问题
怪我咯
怪我咯 2017-04-18 10:26:07
[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线程安全?

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(2)
阿神

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

阿神

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

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

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号