
Java并发编程教程
记录Java并发编程各种读书笔记、以及自己对Java并发编程的理解和思考
在云端123
这个作者很懒,什么都没留下…
展开
-
锁的内存语义
锁的释放-获取建立的happens before关系锁是Java并发编程中最重要的同步机制,锁除了了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息public class MonitorExample { int a = 0; public synchronized void writer() {// 1 a++;// 2 }// 3原创 2017-08-09 09:52:04 · 1049 阅读 · 0 评论 -
volatile的内存语义
volatile特性把对volatile变量的单个读、写,看出是使用同一个锁对这些单个读、写做了同步,比如:public class VolatileFeaturesExample { volatile long vl = 0L; public void set(long l) { vl = l; } public void getAndIncrement(原创 2017-08-09 07:27:13 · 2190 阅读 · 2 评论 -
并发编程——详解 CLH 锁
CLH lock is Craig, Landin, and Hagersten (CLH) locks, CLH lock is a spin lock, can ensure no hunger, provide fairness first come first service.The CLH lock is a scalable, high performance, fairness ...原创 2019-09-12 21:11:28 · 598 阅读 · 1 评论 -
Java并发编程 | 第八篇:java synchronized关键字的用法以及锁的等级:对象锁、类锁
对象锁用于对象实例方法,类锁用于类的静态方法或一个类的class对象。类的对象实例可以有很多,不同对象实例的对象锁互不干扰,而每个类只有一个类锁 他们用来帮助理解锁定实例方法和静态方法的区别 下面是synchronized 代码块和修饰方法public class TestSynchronized { public void test1() { synchron...原创 2017-05-03 14:14:08 · 981 阅读 · 0 评论 -
Java并发编程 | 第七篇:ThreadLocal
ThreadLocal介绍保证所有对象的线程安全除了可以使用锁,还有使用ThreadLocal,当使用ThreadLocal维护变量,ThreadLocal为每个使用变量的线程提供独立的变量副本,所以每一个线程可以独立修改自己的副本,从而隔离了多个线程对数据的访问冲突,在编写多线程代码时,可以把不安全的变量封装到ThreadLocal。前面提到的锁是“以时间换空间”,让不同的线程排队访问同...原创 2017-04-29 11:16:54 · 1164 阅读 · 0 评论 -
Java并发编程 | 第六篇:Fork/Join框架
Fork/Join框架的介绍Fork/Join框架是Java7提供了的一个用于并发执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架Fork/Join执行逻辑 工作窃取算法工作窃取算法是指某个线程从其他队列中窃取任务来执行 在一般情况下,一个物理线程实际需要处理多个逻辑任务,因此每个线程必然需要拥有一个任务队列。比如,线程A已经把...原创 2017-04-24 18:56:06 · 1007 阅读 · 0 评论 -
Java并发编程 | 第五篇:Java并行模式之并行流水线
假如现在有两个数,B和C。如果要计算(B+C)*B/2,那么这个运算过程就是无法并行的。原因是,如果B+C没有执行完成,则永远算不出(B+C)*B,这就是数据相关性。 可以借鉴日常生产中的流水线思想,首先将计算过程拆分为三个步骤: P1:A=B+C P2:D=AxB P3:D=D/2 上述步骤中P1、P2和P3均在单独的线程中计算,并且每个线程只负责自己的工作。此时,P3的计算结果就是最...原创 2017-04-24 16:54:33 · 2331 阅读 · 0 评论 -
Java并发编程 | 第四篇:Future模式
一、什么是Future模型常见的多线程设计模式有:单例模式、不变模式、生产者-消费者模式、Future模式;而这里介绍Future模式,它的核心思想就是异步调用。当我们需要调用一个函数,但是这个函数执行很慢,如果我们不需要马上知道结果,我们可以立即返回,让它在后台慢慢处理这个请求,对于调用者来说,可以先处理一些其他任务,这个就充分利用等待时间,在真正需要数据场合再去尝试获取需要的数据。 ...原创 2017-04-24 15:56:39 · 1462 阅读 · 4 评论 -
Java并发编程 | 第三篇:数据共享通道之BlockingQueue
首先BlockingQueue是一个接口,它的实现类是这些 里面有基于数组实现的ArrayBlockingQueue,适合有界队列和基于链表实现的LinkedBlockingQueue,适合无界队列,因为长度可以动态增加为什么BlockingQueue可以做数据共享通道因为BlockingQueue会让服务线程(不断从队列中取任务,然后进行处理的线程)在队列为空时进行等待,当新的...原创 2017-04-24 00:20:32 · 897 阅读 · 0 评论 -
Java并发编程 | 第二篇:ReentrantLock重入锁
首先重入锁用ReentrantLock来实现的,关于重入锁ReentrantLock的几个重要方法: 1、lock():获得锁,如果锁被占用,只能等待 2、lockInterruptibly():获得锁,可以响应中断 3、tryLock():尝试获得锁,如果成功返回true,失败返回false,该方法不等待,立即返回 4、tryLock(long time,TimeUnit unit):设...原创 2017-04-02 11:30:40 · 913 阅读 · 0 评论 -
Java并发编程 | 第一篇: Java线程池
线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源。就好比原来去食堂打饭是每个人看谁抢的赢,谁先抢到谁先吃,有了线程吃之后,就是排好队形,今天我跟你关系好,你先来吃饭。比如:一个应用要和网络打交道,有很多步骤需要...原创 2017-02-24 21:02:42 · 1804 阅读 · 0 评论