![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java并发编程实战
文章平均质量分 86
json_it学习笔记
纸上得来终觉浅,绝知此事要躬行
展开
-
并发编程实战 - 基础部分[线程安全性、对象的共享]
1、Java中的主要同步机制是关键字synchronized,它提供了一种独占的加锁方式,但“同步”这个术语还包括volatile类型的变量,显式锁和原子变量。2、线程安全的程序是否完全由线程安全类构成?答案是否定的。完全由线程安全类构成的程序并不一定是线程安全的,而在线程安全类中也可以包含非线程安全的类。3、在线程安全性的定义中,最核心的概念就是正确性。即当多个线程访问某个类时,这个类始原创 2017-12-17 15:56:49 · 229 阅读 · 0 评论 -
并发编程实战 - 线程池的使用
在标准的Executor实现中,当执行需求较低时将回收空闲线程,而当需求增加时将添加新的线程,并且如果从任务中抛出了未检查异常,那么将用一个新的工作者线程替代抛出异常的线程。只有当线程本地值的生命周期受限于任务的生命周期时,在线程池中的线程使用ThreadLocal才有意义,而在线程池的线程中不应该使用ThreadLocal在任务之间传递值。只有当任务都是同类型的并且相互独立时,线程池的性能才原创 2018-01-23 22:00:20 · 261 阅读 · 0 评论 -
并发编程实战 - [任务执行、取消与关闭]
1、任务执行1.1、Executor1.1.1、线程池与Executor生命周期Executor基于生产者-消费者模式,我们可以通过Executors的四个静态工厂方法创建线程池:newFixedThreadPool、newCachedThreadPool、newSingleThreadExecutor、newScheduledThreadPool。这四个工厂方法其实都是通过Threa原创 2018-01-09 21:17:51 · 560 阅读 · 0 评论 -
并发编程实战 - 基础部分[对象的组合、基础构建模块]
我们并不希望每一次内存访问都进行分析以确保程序是线程安全的,而是希望将一些现有的线程安全组件组合为更大规模的组件或程序。1、对象的组合1、设计线程安全的类,包含三要素:找出构成对象状态的所有变量;找出约束状态变量的不变性条件;建立对象状态的并发访问管理策略;所谓的不可变条件可以理解为保持状态变量之间关系的一种约束,比如a要确保类的线程安全性,就需要确保它的不变性条件原创 2018-01-07 11:17:41 · 265 阅读 · 0 评论 -
并发编程实战 - 原子变量与非阻塞同步机制
在java.util.concurrent包的许多类中,例如Semaphore和ConcurrentLinkedQueue,都提供了比Synchronized机制更高的性能和可伸缩性。这种性能提升的主要来源:原子变量和非阻塞的同步机制。近年来,在并发算法领域的大多数研究都侧重于非阻塞算法,这种算法用底层的原子机器指令代替锁来确保数据在并发访问中的一致性。非阻塞算法被广泛应用于在操作系统和JVM原创 2018-02-02 07:41:15 · 283 阅读 · 0 评论 -
并发编程实战 - 避免活跃性危险【死锁场景】
顺序死锁与资源死锁 - 我们使用加锁机制来确保线程安全,但是如果过度的使用加锁,则可能导致锁顺序死锁。同样,我们使用线程池和信号量来限制对资源的使用,但这些限制的行为可能导致资源死锁。在数据库系统的设计中考虑了监测死锁以及从死锁中恢复。当执行一个事务时可能需要获取多个锁,并一直持有这些锁直到事务提交。因此两个事务之间很可能发生死锁。当发生死锁的时候,数据库服务器将选择一个牺牲者并放弃这个事务。原创 2018-01-26 00:42:24 · 252 阅读 · 0 评论 -
Java 内存模型[部分概念,详细查阅书籍]
1、什么是内存模型,为什么需要它假设一个线程为变量aVariable赋值:aVariable = 3;内存模型需要解决这个问题:在什么条件下,读取aVariable的线程将看到这个值为3?这似乎看起来愚蠢的问题,如果缺少同步,那么将会有很多因素使得线程无法立即甚至永远,看到另一个线程的操作结果。在编译器中生成的指令顺序,可以与源代码中的顺序不同,此外编译器还能把变量保存在寄存器而不原创 2018-02-03 11:28:40 · 437 阅读 · 0 评论 -
并发编程实战 - 性能和可伸缩性、显式锁
一、性能和可伸缩性1、可伸缩性:当增加计算资源时(例如CPU、内存、存储容量或IO带宽),程序的吞吐量或者处理能力相应地增加。2、在并发程序中,对可伸缩性的主要威胁就是独占式的资源锁。我们知道,串行操作会降低可伸缩性,并且上下文切换也会降低性能。在锁上竞争时将同时导致这两种问题,因此减少锁的竞争能够提高性能和可伸缩性。3、有三种方式可以降低锁的竞争程度:a)减少锁的持有时间;【原创 2018-01-28 20:11:31 · 277 阅读 · 0 评论