V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
esolve
V2EX  ›  问与答

关于 Collections.synchronizedList 使用的时候为何必须就加 synchronized()同步方法?

  •  
  •   esolve · 2017-03-10 22:58:05 +08:00 · 2529 次点击
    这是一个创建于 2815 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如下

    func(){
    
        List list = Collections.synchronizedList(new ArrayList());
        ...
        synchronized (list) {
          Iterator i = list.iterator(); // Must be in synchronized block
          while (i.hasNext())
              foo(i.next());
        }
        ...
    }
    

    javadoc 说用 synchronizedList 的时候,如果有迭代器,就必须对这个对象加 synchronized()同步方法 网上解释, synchronizedList 在迭代的时候,需要开发者自己加上线程锁控制代码,因为在整个迭代的过程中如果在循环外面不加同步代码,在一次次迭代之间,其他线程对于这个容器的 add 或者 remove 会影响整个迭代的预期效果,所以这里需要用户在整个循环外面加上 synchronized(list);

    假设有另一个线程在不进行 synchronized (list)的情况下对 list 进行修改的话呢?岂不是上面的 synchronized (list) 没用?

    1 条回复    2017-03-11 01:57:45 +08:00
    SoloCompany
        1
    SoloCompany  
       2017-03-11 01:57:45 +08:00
    1. 你对 synchronized 关键字的理解还需要多了解,本地锁是提供给你的一种语言特性,语言自身不可能了解你的业务逻辑而自动帮你对代码块加锁

    2. synchronizedList 只是帮你做了个封装,确保数据基本操作( add/set/delete 等)具备原子性,不用担心因为并发而导致内部数据结构完全错乱,而超出基本操作范围的原子性,参考 1 ,必然需要应用代码自己去实现
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   994 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 20:13 · PVG 04:13 · LAX 12:13 · JFK 15:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.