
Java多线程
JeffCoding
热爱移动互联网,热爱安卓,热爱Java
展开
-
《Java并发编程实战》读书笔记四:活跃性和性能,死锁和显示锁
博文目录一、活跃性危险:死锁 - 1.锁顺序死锁 - 2.动态锁顺序死锁 - 3.协作对象之间的死锁 - 4.死锁的避免与分析 - 5.其它活跃性危险二、性能和可伸缩性 - 1.使用线程的性能开销 - 2.减少锁竞争提升性能三、显式锁(Lock) - 1. ReentrantLock和synchronized的比较 - 2. ReentrantLock的高级功能 - 3. 公平锁原创 2016-12-27 11:45:17 · 1036 阅读 · 0 评论 -
使用Lock和Condition实现哲学家算法问题
问题问题描述:一圆桌前坐着5位哲学家,两个人中间有一只筷子,桌子中央有面条。哲学家思考问题,当饿了的时候拿起左右两只筷子吃饭,必须拿到两只筷子才能吃饭。上述问题会产生死锁的情况,当5个哲学家都拿起自己右手边的筷子,准备拿左手边的筷子时产生死锁现象。代码代码逻辑: 多少个哲学家,就有多少个筷子,判断哲学家左右两边的筷子是否正在使用,如果正在被使用,则将当前哲学家阻塞起来哲学家:public clas原创 2017-07-30 20:55:56 · 658 阅读 · 0 评论 -
《Java并发编程实战》读书笔记二:构建线程安全
一、用组合来实现线性安全1.设计线程安全的类设计线程安全类的三个基本要素: 1. 找出构成对象状态的所有变量 2. 找出约束状态变量的不变性条件 3. 建立对象状态的并发访问管理策略要分析对象的状态,首先从对象的域开始。如果对象所有的域都是基本类型的变量,那么这些域将构成对象的全部状态;如果对象的域中引用了其他对象,那么该对象的状态将包含被引用的对象的域。2.实例封闭当一个对象被封装到另一个对原创 2016-12-24 20:54:17 · 1058 阅读 · 1 评论 -
线程间协作的两种方式:wait、notify、notifyAll和Condition
以下是本文目录大纲: 一.wait()、notify()和notifyAll() 二.Condition 三.生产者-消费者模型的实现 若有不正之处请多多谅解,并欢迎批评指正。 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin0520/p/3920385.html 一.转载 2017-03-09 17:17:46 · 733 阅读 · 0 评论 -
深入理解Java内存模型(六)——final
与前面介绍的锁和volatile相比较,对final域的读和写更像是普通的变量访问。对于final域,编译器和处理器要遵守两个重排序规则:在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。下面,我们通过一些示例性的代码来分别说转载 2017-08-07 21:32:11 · 434 阅读 · 0 评论 -
Condition源码解析
在没有Lock之前,我们使用synchronized来控制同步,配合Object的wait()、notify()系列方法可以实现等待/通知模式。在Java SE5后,Java提供了Lock接口,相对于Synchronized而言,Lock提供了条件Condition,对线程的等待、唤醒操作更加详细和灵活。下图是Condition与Object的监视器方法的对比(摘自《Java并发编程的艺术》):转载 2017-08-11 16:45:57 · 1459 阅读 · 0 评论 -
单例的各种写法以及双重检查的问题
一、懒汉式,线程不安全public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance =原创 2017-08-05 19:59:52 · 1143 阅读 · 0 评论 -
深入分析AbstractQueuedSynchronizer独占锁的实现原理:ReentranLock
一、ReentranLock 相信我们都使用过ReentranLock,ReentranLock是Concurrent包下一个用于实现并发的工具类(ReentrantReadWriteLock、Semaphore、CountDownLatch等),它和Synchronized一样都是独占锁,它们两个锁的比较如下: 1. ReentrantLock实现了Lock接口,提供了与synchroni原创 2017-02-23 18:06:30 · 3217 阅读 · 0 评论 -
深入分析CAS
CAS,Compare And Swap,即比较并交换。Doug lea大神在同步组件中大量使用CAS技术鬼斧神工地实现了Java多线程的并发操作。整个AQS同步组件、Atomic原子类操作等等都是以CAS实现的,甚至ConcurrentHashMap在1.8的版本中也调整为了CAS+Synchronized。可以说CAS是整个JUC的基石。 CAS分析在CAS中有三个参数:内转载 2017-07-17 23:57:30 · 692 阅读 · 0 评论 -
ThreadPoolExecutor策略配置以及应用场景
ThreadPoolExecutor 是用来处理异步任务的一个接口,可以将其理解成为一个线程池和一个任务队列,提交到 ExecutorService 对象的任务会被放入任务队或者直接被线程池中的线程执行。ThreadPoolExecutor 支持通过调整构造参数来配置不同的处理策略,本文主要介绍常用的策略配置方法以及应用场景。ThreadPoolExecutor 的处理逻辑首先看一转载 2017-03-24 23:11:31 · 536 阅读 · 0 评论 -
Java并发编程:Callable、Future和FutureTask
在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。 如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。 而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕转载 2017-03-09 17:36:15 · 420 阅读 · 0 评论 -
《Java并发编程实战》读书笔记一:基础知识
一、线程安全性一个对象是否是需要是线性安全的,取决于它是否需要被多个线程访问 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要额外的同步,这个类都能表现正确的行为,那么就说这个类是线程安全的。1. 无状态对象无状态对象不包含域,也不包含与其他类中域的引用,计算过程中的临时状态仅存在于线程栈中的局部变量上,并且只能由正在执行的线程访问。访问无状原创 2016-12-20 19:47:11 · 4415 阅读 · 0 评论 -
《Java并发编程实战》读书笔记五:深入理解同步实现
博文目录一、构建自定义的同步工具 - 1. 内置的条件队列 - 2. Condition对象 - 3. AbstractQueuedSynchronizer(AQS)(重点) - 4. java.util.concurrent同步类中的AQS二、原子变量和非阻塞同步机制 - 1. 比较并交换(CAS) - 2.非阻塞算法一、构建自定义的同步工具1. 内置的条件队列条件队列就如同烤面包机上原创 2016-12-28 00:15:17 · 726 阅读 · 0 评论 -
Java的内存机制(堆和栈)简单理解
偶然看到一道面试题,Java在实例化一个类的时候,数据在堆和栈中是如何存放的?public class A{ public int i=1; public static A a1 = new A(); public static void mian(String args[]){ int c = 2; A a=new A(); }}答案是:原创 2016-12-19 21:33:06 · 911 阅读 · 0 评论 -
Java并发编程:Java内存模型和volatile关键字解析
Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。 volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java转载 2016-12-12 20:17:31 · 1143 阅读 · 0 评论 -
《Java并发编程实战》读书笔记三:使用Executor框架
博文目录一、Executor框架 - 1.使用Executor框架 - 2.线程池 - 3.Executor的生命周期:ExecutorService - 4.延迟任务和周期任务 - 5.Callable对比Runnable - 6.Callable和Future结合使用返回结果 - 7.CompletionService和BlockingQueue二、取消和关闭 - 1.通过取消标原创 2016-12-26 19:39:45 · 1934 阅读 · 1 评论 -
非阻塞同步算法与CAS(Compare and Swap)无锁算法
锁(lock)的代价锁是用来做并发最简单的方式,当然其代价也是最高的。内核态的锁的时候需要操作系统进行一次上下文切换,加锁、释放锁会导致比较多的上下文切换和调度延时,等待锁的线程会被挂起直至锁释放。在上下文切换的时候,cpu之前缓存的指令和数据都将失效,对性能有很大的损失。操作系统对多线程的锁进行判断就像两姐妹在为一个玩具在争吵,然后操作系统就是能决定他们谁能拿到玩具的父母,这是很慢的。用转载 2017-02-23 13:23:24 · 655 阅读 · 0 评论 -
JDK7下ConcurrentHashMap源码分析
一、ConcurrentHashMap出现的原因 我们之前学过HashMap,也知道HashMap不是线程安全的,在多线程环境下,HashMap的put方法有可能引起死循环。于是HashTable这个类出现,它在大量的方法前都加了内置锁Synchronized,这就保证了它的线程安全性,但是这种方法太极端,导致效率低下。当一个线程访问了HashTable的同步方法时,其它线程就只能等待该线程释放锁原创 2017-02-22 20:30:44 · 5140 阅读 · 5 评论 -
深入分析AbstractQueuedSynchronizer共享锁的实现原理:CountDownLatch
转自:深度解析Java 8:AbstractQueuedSynchronizer的实现分析AQS共享功能的实现在开始解读AQS的共享功能前,我们再重温一下CountDownLatch,CountDownLatch为java.util.concurrent包下的计数器工具类,常被用在多线程环境下,它在初始时需要指定一个计数器的大小,然后可被多个线程并发的实现减1操作,并在计数器为0后转载 2017-02-23 19:35:38 · 1904 阅读 · 0 评论 -
Java并发编程——阻塞队列
1.什么是阻塞队列阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。BlockingQueue有两个常见阻塞场景当队列中没有数据的情况下,消费者端的所有线程都会被自动阻塞(挂起),直到有数据放入队列。这里写图片描述当队列中填满数据的情况下,生产者端的转载 2017-08-13 21:12:20 · 628 阅读 · 0 评论