
Java并发编程的艺术
qq_45366515
这个作者很懒,什么都没留下…
展开
-
Java并发编程(13)原子操作类
当程序更新一个变量时,如果多先册灰姑娘同时更新这个变量,可能得到期望之外的值,比如变量i++,A线程更新i+1,B线程也更新i+1,经过两个线程操作之后可能i不等于3,而是等于2...原创 2020-04-09 16:07:04 · 110 阅读 · 0 评论 -
Java并发编程的艺术---线程池的使用
线程池的使用线程池的创建看一下常用的构造方法 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ...原创 2020-04-09 15:47:39 · 106 阅读 · 0 评论 -
Java并发编程的艺术---线程池实现原理
线程池的实现原理线程池处理流程(1)线程池判断核心线程池里的线程是否都在执行任务。如果不是,则创建一个新的工作线程来执行任务。如果核心线程池里的线程都在执行任务,则进入下个流程(2)线程池判断工作队列是否已经满。如果工作队列没有满,则将新提交的任务存储在这个工作队列里。如果工作队列满了。则进入下一个流程(3)线程池判断线程池的线程是否都处于工作状态。如果没有,则创建一个新的工作线程来执行。...原创 2020-04-09 00:23:59 · 170 阅读 · 0 评论 -
Java并发编程的艺术(17)Exchanger
线程间交换数据的ExchangerExchanger(交换者)是一个用于线程间协作的工具类。Exchanger用于进行线程间的数据交 换。它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据。这两个线程通过 exchange方法交换数据,如果第一个线程先执行exchange()方法,它会一直等待第二个线程也 执行exchange方法,当两个线程都到达同步点时,这两个线程就可以交换数据,将本...原创 2020-04-02 12:44:30 · 101 阅读 · 0 评论 -
Java并发编程的艺术(16)Semaphore
控制并发线程数的SemaphoreSemaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源比如××马路要限制流量,只允许同时有一百辆车在这条路上行使,其他的都必须 在路口等待,所以前一百辆车会看到绿灯,可以开进这条马路,后面的车会看到红灯,不能驶 入××马路,但是如果前一百辆中有5辆车已经离开了××马路,那么后面就允许有5辆车驶入马 路,这...原创 2020-04-02 12:39:09 · 81 阅读 · 0 评论 -
Java并发编程的艺术(15)CyclicBarrier
CyclicBarrier简介CyclicBarrier默认的构造方法是CyclicBarrier(int parties),其参数表示屏障拦截的线程数 量,每个线程调用await方法告诉CyclicBarrier我已经到达了屏障,然后当前线程被阻塞。public class CyclicBarrierTest { static CyclicBarrier c = new Cyclic...原创 2020-04-02 12:28:23 · 142 阅读 · 0 评论 -
Java并发编程的艺术(14)CountDownLatch
CountDownLatchCountDownLatch允许一个或多个线程等待其他线程完成操作假如有这样一个需求:我们需要解析一个Excel里多个sheet数据,此时可以考虑使用多线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要提示解析完成。在这个需求中,要实现主线程等待所有线程完成sheet的解析操作,最简单的做法时使用join()方法public cl...原创 2020-04-02 12:06:47 · 104 阅读 · 0 评论 -
Java并发编程的艺术(12)重入锁和读写锁
重入锁重入锁ReentrantLock,表示该锁能够支持一个线程对资源的重复加锁。支持获取锁时的公平和非公平性选择。synchronized关键字隐式的支持重进入,比如一个synchronized修饰的递归方法,在方法执行时,执行线程在获取了锁之后仍能连续多次地获得该锁。ReentrantLock虽然没能像synchronized关键字一样支持隐式的重进入,但是在调用lock()方 法时,已...原创 2020-04-01 20:23:09 · 132 阅读 · 0 评论 -
Java并发编程的艺术(11)AQS队列同步器
LOCK原创 2020-04-01 13:22:36 · 203 阅读 · 0 评论 -
Java并发编程的艺术(10)并发编程基础
线程简介现代操作系统在运行一个程序时,会为其创建一个进程。例如,启动一个Java程序,操作系统就会创建一个Java进程。进程是操作系统可以调度的最小单位。一个进程可以包含多个线程,这些线程都拥有各自的计数器、堆栈、和局部变量等属性,并且能够访问共享变量。线程是CPU分配资源的最小单位。线程优先级现代操作系统基本采用时分的形式调度运行的线程,操作系统会分出一个个时间片,线程会分配到若干时...原创 2020-03-28 14:43:16 · 80 阅读 · 0 评论 -
Java并发编程的艺术(9)final
final域的读和写更像是普通的变量访问final域的重排序规则对于final域,编译器和处理器要遵守两个重排序规则。(1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。(2)初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能 重排序。示例在这里插入代码片...原创 2020-03-27 23:29:55 · 81 阅读 · 0 评论 -
Java并发编程的艺术(8)锁的内存语义
从所周知,锁可以让临界区互斥执行。锁的释放-获取建立的happens-before关系锁时Java并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息。class MonitorExample { int a = 0; public synchronized void writer() { 1 a++...原创 2020-03-27 19:17:23 · 139 阅读 · 0 评论 -
Java并发编程的艺术---volatile内存语义及实现
当声明共享变量为volatile后,对这个变量的读/写将会特别。volatile的特性(1)可见性:对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入(2)原子性:对任意单个volatile变量的读/写具有原子性,但类似于volatile++这种复合操作不具有原子性volatile写-读建立的happens-before关系volatile写-读的...原创 2020-03-27 16:44:49 · 171 阅读 · 1 评论 -
Java并发编程的艺术---happens-before
happens-before原创 2020-03-27 12:49:09 · 195 阅读 · 0 评论 -
Java并发编程的艺术-锁的状态与对比
锁的升级Java SE1.6为了减少获得锁和释放锁带来的性能消耗,引入了“偏向锁”和“轻量级锁”,在JavaSE 1.6中,锁一共有4中状态,级别从低到高一次是:无所状态、偏向锁状态、轻量级锁状态和重量级锁状态,这几个状态会随着竞争情况逐渐升级。锁可以升级但不能降级,意味着偏向锁升级成轻量级锁后不饿能降级成偏向锁。这种锁升级却不能降级的册罗,目的是为了提高获得锁和释放锁的效率偏向锁大多数情...原创 2020-03-26 20:28:51 · 139 阅读 · 0 评论 -
Java并发编程的艺术-原子性
原子操作的实现原理原子(atomic)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意 为“不可被中断的一个或一系列操作”。在多处理器上实现原子操作就变得有点复杂。让我们 一起来聊一聊在Intel处理器和Java里是如何实现原子操作的。处理器如何实现原子操作(1)使用总线锁保证原子性如果多个处理器同时对共享变量进行读改写操作(i++),那么共享变量就会...原创 2020-03-26 16:41:19 · 206 阅读 · 0 评论 -
Java并发编程的艺术-synchronized和volatile底层实现原理
volatile的定义与实现Java编程语言允许线程访问共享变量,为了确保共享变量能够准确和一致的更新,线程应该通过排他锁单独获取这个变量。如果一个字段被声明为volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的。Lock前缀有volatile变量修饰的共享变量进行读写操作时,JVM就会向处理器发送一条Lock前缀指令,Lock前缀的指令在多核CPU处理器下会引发以下两...原创 2020-03-26 16:07:53 · 131 阅读 · 0 评论 -
Java并发编程的艺术-并发编程问题
为什么要并发编程并发编程的目的是为了让程序运行得更快。并发编程会遇到的问题,上下文切换问题,死锁问题,以及受限于硬件和软件的资源限制问题。上下文切换CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是,在切换前会保留上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。所以任务从保存到再加载的过程就是一次上下文切换。死锁线程t1和线程t...原创 2020-03-26 12:29:02 · 119 阅读 · 0 评论