KEEP ON CODING......

随笔分类 -  JAVA多线程及并发编程

《JAVA并发编程实战》学习笔记,多线程理论分析及实践
摘要:1. Executor基于生产者-消费者模式,提交任务的操作相当于生产者,执行任务的线程相当于消费者,如果要在程序中实现一个生产者-消费者的设计,最简单的方式通常就是使用Executor 2. Executor的生命周期: 为了解决执行任务的生命周期问题,Executor扩展了ExecutorSer 阅读全文
posted @ 2018-02-23 16:07 Cecil2020 阅读(225) 评论(0) 推荐(0)
摘要:1. 多线程场景下尽量使用并发容器代替同步容器 (如ConcurrentHashMap代替同步且基于散列的Map, 遍历操作为主要操作的情况下用CopyOnWriteArrayList代替同步的List) ConcurrentHashMap:分段锁机制,多线程条件下优于HashMap+synchro 阅读全文
posted @ 2018-02-23 16:07 Cecil2020 阅读(259) 评论(0) 推荐(0)
摘要:一、引子 如果java内存模型中所有的有序性都仅仅依靠volatile和synchronized来完成,那么有一些操作会变得很繁琐,但我们在编写java并发代码时并未感觉到这一点,这是因为java语言中有个先行发生原则(happens-before),通过这个原则,我们可以通过几条规则一揽子解决并发 阅读全文
posted @ 2017-08-21 18:37 Cecil2020 阅读(404) 评论(0) 推荐(0)
摘要:一、简述: 关键字Volatile是JAVA虚拟机提供的最轻量级的同步机制,但是它并不容易完全被正确、完整的理解,以致于许多程序员在遇到需要处理多线程数据竞争的时候一律使用synchronized来进行同步,了解volatile变量的语义对后面了解多线程操作的其他特性很有意义。 二、应用: 当一个变 阅读全文
posted @ 2017-08-21 18:31 Cecil2020 阅读(613) 评论(0) 推荐(0)
摘要:创建线程一般有如下几个方式: 1. 通过继承Thread类来创建一个线程: /** * 步骤1:定义一个继承Thread类的子类 * 步骤2:构造子类的一个对象 * 步骤3:启动线程: * */ public class ThreadTest{ public static void main(Str 阅读全文
posted @ 2017-03-04 16:25 Cecil2020 阅读(232) 评论(0) 推荐(0)
摘要:一、 如果在持有锁时调用某个外部方法,那么将出现活跃性问题。在这个外部方法中可能会获取其他锁(这可能会产生死锁),或者阻塞时间过长,导致其他线程无法及时获得当前被持有的锁。如下代码: 尽管没有任何方法会显式的获取两个锁,但setLocation和getImage等方法的调用者都会获得两个锁。因为se 阅读全文
posted @ 2016-12-19 08:55 Cecil2020 阅读(594) 评论(0) 推荐(0)
摘要:一、需求描述: 将资金从一个账户转移到另一个账户。 二、程序实现: (1)账户类: (2)资产转移类: (3)测试类: (4)解析: 上述程序容易形成死锁,原因在于多账户调用TransMoney.transferMoney时,存在锁顺序冲突, 解决方案是使用System.identityHashCo 阅读全文
posted @ 2016-12-17 10:08 Cecil2020 阅读(1017) 评论(0) 推荐(0)
摘要:1.线程池管理类: public class ThreadPoolManager { private static ThreadPoolManager instance = new ThreadPoolManager(); private ExecutorService secLogThreadPo 阅读全文
posted @ 2016-11-23 17:32 Cecil2020 阅读(3591) 评论(0) 推荐(0)
摘要:FutureTask是Future和Callable的结合体。传统的代码是这样写的Future f = executor.submit(new Callable()); 然后通过Future来取得计算结果。但是,若开启了多个任务,我们无从知晓哪个任务最先结束,因此,若要实现“当某任务结束时,立刻做一 阅读全文
posted @ 2016-11-18 10:07 Cecil2020 阅读(208) 评论(0) 推荐(0)
摘要:1. Thread(1) run()方法编写执行代码(2) start() 启动线程(3) 通过创建Thread子类的实例创建线程对象(4) 实例如下: public class ThreadTest extends Thread{ public void run(){ System.out.pri 阅读全文
posted @ 2016-11-18 10:05 Cecil2020 阅读(308) 评论(0) 推荐(0)
摘要:一、并发容器:ConcurrentHashMap:1、分段锁机制: 任意数量的读取线程可以并发的访问map,执行读取操作的线程和执行写入操作的线程可以并发的访问Map,并且一定数量的写入线程可以并发的修改Map。2、无需再迭代过程中对容器加锁;3、ConcurrentHashMap无法实现对Map加 阅读全文
posted @ 2016-11-17 19:44 Cecil2020 阅读(200) 评论(0) 推荐(0)
摘要:一、非原子的64位操作: 当线程在没有同步的情况下读取变量时,可能会得到一个失效值,但至少这个值是由之前某个线程设置的值,而不是一个随机值,这种安全性保证被称为最低安全性。最低安全性适用于绝大多数变量,但存在一个例外:非volatile类型的64位数值变量(double,long),Java内存模型 阅读全文
posted @ 2016-08-02 07:47 Cecil2020 阅读(1540) 评论(0) 推荐(0)
摘要:1、wait & notify 方法: public class WaitAndNotify { private final int MAX_SIZE = 100; private LinkedList<Object> list = new LinkedList<Object>(); public 阅读全文
posted @ 2016-06-30 19:27 Cecil2020 阅读(344) 评论(0) 推荐(0)