资讯专栏INFORMATION COLUMN

看java并发编程实战 Synchronized 的一点思考

Tonny / 323人阅读

摘要:看并发编程实战第章程序清单附件时对于下面的话如何理解我的理解是方法等同于他是对上的锁,也只能保证同一时刻只有一个线程可以访问同一实例的方法。的是对进行上锁,因此任何访问的线程安全的方法,同一时刻只能有一个线程进行。

看《java 并发编程实战》 第4章 程序清单4-14附件时

class BadListHelper {

public List list = Collections.synchronizedList(new ArrayList());

public synchronized boolean putIfAbsent(E x) {
    boolean absent = !list.contains(x);
    if (absent)
        list.add(x);
    return absent;
}

}

@ThreadSafe
class GoodListHelper {

public List list = Collections.synchronizedList(new ArrayList());

public boolean putIfAbsent(E x) {
    synchronized (list) {
        boolean absent = !list.contains(x);
        if (absent)
            list.add(x);
        return absent;
    }
}

}

对于BadListHelper 下面的话如何理解?

我的理解是:
public synchronized boolean putIfAbsent(E x)方法等同于
public boolean putIfAbsent(E x){
synchronized (this){

  ....

}
}

他是对BadListHelper 上的锁,也只能保证同一时刻只有一个线程可以访问BadListHelper 同一实例的putIfAbsent方法。但是持有list的引用的其它线程任然可以使用list其它方法修改list(即使该方法对应list来说是线程安全的、原子的); 但是我们的目的是 为了同一时刻只能有一个线程可以修改list。 因此书上说 “问题在于错误的锁上进行了同步” 。

GoodListHelper 的putIfAbsent是对list进行上锁,因此任何访问list的线程安全的方法,同一时刻只能有一个线程进行。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67056.html

相关文章

  • 初学者福音!可能是最适合你的Java学习路线和方法推荐。

    摘要:学习完多线程之后可以通过下面这些问题检测自己是否掌握,下面这些问题的答案以及常见多线程知识点的总结在这里。可选数据结构与算法如果你想进入大厂的话,我推荐你在学习完基础或者多线程之后,就开始每天抽出一点时间来学习算法和数据结构。 我自己总结的Java学习的系统知识点以及面试问题,已经开源,目前已经 35k+ Star。会一直完善下去,欢迎建议和指导,同时也欢迎Star: https://...

    yanest 评论0 收藏0
  • Java 重入锁 ReentrantLock 原理分析

    摘要:的主要功能和关键字一致,均是用于多线程的同步。而仅支持通过查询当前线程是否持有锁。由于和使用的是同一把可重入锁,所以线程可以进入方法,并再次获得锁,而不会被阻塞住。公平与非公平公平与非公平指的是线程获取锁的方式。 1.简介 可重入锁ReentrantLock自 JDK 1.5 被引入,功能上与synchronized关键字类似。所谓的可重入是指,线程可对同一把锁进行重复加锁,而不会被阻...

    lx1036 评论0 收藏0
  • 【转】成为Java顶尖程序员 ,这10本书就够了

    摘要:实战高并发程序设计这本书是目前点评推荐比较多的书,其特色是案例小,好实践代码有场景,实用。想要学习多线程的朋友,这本书是我大力推荐的,我的个人博客里面二十多篇的多线程博文都是基于此书,并且在这本书的基础上进行提炼和总结而写出来的。 学习的最好途径就是看书,这是我自己学习并且小有了一定的积累之后的第一体会。个人认为看书有两点好处:showImg(/img/bVr5S5);  1.能出版出...

    DTeam 评论0 收藏0
  • 【J2SE】java并发编程实战 读书笔记( 一、二、三章)

    摘要:发布的对象内部状态可能会破坏封装性,使程序难以维持不变性条件。不变性线程安全性是不可变对象的固有属性之一。可变对象必须通过安全方式来发布,并且必须是线程安全的或者有某个锁保护起来。 线程的优缺点 线程是系统调度的基本单位。线程如果使用得当,可以有效地降低程序的开发和维护等成本,同时提升复杂应用程序的性能。多线程程序可以通过提高处理器资源的利用率来提升系统的吞吐率。与此同时,在线程的使用...

    QLQ 评论0 收藏0
  • 深入理解 Java 多线程系列(1)——一个简单需求的并行改造 & Java多线程的通信问题

    摘要:所以接下来,我们需要简单的介绍下多线程中的并发通信模型。比如中,以及各种锁机制,均为了解决线程间公共状态的串行访问问题。 并发的学习门槛较高,相较单纯的罗列并发编程 API 的枯燥被动学习方式,本系列文章试图用一个简单的栗子,一步步结合并发编程的相关知识分析旧有实现的不足,再实现逻辑进行分析改进,试图展示例子背后的并发工具与实现原理。 本文是本系列的第一篇文章,提出了一个简单的业务场景...

    ruicbAndroid 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<