Java并发编程
文章平均质量分 93
jy02268879
这个作者很懒,什么都没留下…
展开
-
【一】Java多线程之线程的状态
原文Java线程的6种状态及切换(透彻讲解)Java中的线程的状态分为6种。1.初始(NEW):新创建了一个线程对象,但还没有调用start()方法。2.运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的成为“运行”。线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等...转载 2018-08-11 14:42:23 · 204 阅读 · 0 评论 -
【十二】Java多线程J.U.C之 CyclicBarrier
CyclicBarrier是一个同步工具类,它允许一组线程互相等待,直到到达某个公共屏障点。与CountDownLatch不同的是该barrier在释放等待线程后可以重用,所以称它为循环(Cyclic)的屏障(Barrier)。CyclicBarrier支持一个可选的Runnable命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。代码示例...原创 2019-01-07 16:46:04 · 211 阅读 · 0 评论 -
【十三】Java多线程J.U.C之 Semaphore
概述信号量Semaphore的作用是控制最大并发数。信号量是一个非负整数,所有通过它的线程都会将该整数减一,当该整数值为零时,所有试图通过它的线程都将处于等待状态。通过 acquire() 获取一个许可(阻塞),如果没有就等待,而 release() 释放一个许可。可以设置该信号量是否采用公平模式,如果以公平方式执行,则线程将会按到达的顺序(FIFO)执行,如果是非公平,则可以后请...原创 2019-01-07 17:04:06 · 154 阅读 · 0 评论 -
【十四】Java多线程J.U.C之 Phaser
概述Phaser把多个线程协作执行的任务划分为多个阶段,编程时需要明确各个阶段的任务,每个阶段都可以有任意个参与者,线程都可以随时注册并参与到某个阶段Phaser比较适合这样一种场景,一种任务可以分为多个阶段,现希望多个线程去处理该批任务,对于每个阶段,多个线程可以并发进行,但是希望保证只有前面一个阶段的任务完成之后才能开始后面的任务。方法简介arriveAndAwaitA...原创 2019-01-07 18:08:12 · 176 阅读 · 0 评论 -
【十五】Java多线程之volatile(可见性、有序性、happens-before、内存屏障和禁止重排序)
一、简介volatile能保证可见性、有序性、但是不能保证原子性。它靠内存屏障和禁止重排序来实现可见性、有序性。二、可见性1.导致共享变量在线程间不可见的原因:线程交叉执行 重排序结合线程交叉执行 共享变量更新后的值没有在线程工作内存和主存之间及时更新2.可见性(synchronize、volatile可以保证可见性)这篇只说volatile,synchronize在其他...原创 2019-01-08 13:25:41 · 707 阅读 · 0 评论 -
【十六】Java多线程J.U.C之atomic包(原子性、CAS、UnSafe)
一、概述原子性提供了互斥访问,同一时刻只会有一个线程对资源进行操作。该包下提供了具有原子性的数据类型。它是通过CAS来实现原子性的。java.util.concurrent.atomic以AtomicInteger的incrementAndGet()方法为例 /** * Atomically increments by one the current v...原创 2019-01-08 17:22:18 · 344 阅读 · 0 评论 -
【十七】Java多线程之不可变 变量、集合(final、Collections.unmodifiableXXX、ImmutableXXX、浅拷贝)
一、final关键字可以用来修饰类、方法、变量1.final类不能被继承final类中的所有成员方法都会被隐式的指定为final方法。2.final方法子类不能覆盖该方法,一个类的priavte方法会隐式的被指定为final方法3.final变量final修饰的基本数据类型的变量,它的值在初始化后就不能修改。final修饰的引用类型的变量,它在初始化之后不能再指...原创 2019-01-09 15:00:57 · 496 阅读 · 0 评论 -
【十八】Java多线程J.U.C之并发容器(线程安全、CopyOnWriteArrayList、ConcurrentSkipListSet)
一、CopyOnWriteArrayListArrayList对应的线程安全的并发容器是CopyOnWriteArrayListHashSet对应的线程安全的并发容器是CopyOnWriteArraySetCopyOnWriteArraySet与CopyOnWriteArrayList雷同例如private static List<Integer> list = ...原创 2019-01-09 16:03:02 · 454 阅读 · 0 评论 -
【十九】Java多线程J.U.C之ReentrantLock和Condition(ReentrantLock与Synchronized的区别)
ReentrantLock和Synchronized比较优点:1.ReentrantLock可以指定是公平锁还是非公平锁,默认是非公平锁。而Synchronized只能是非公平锁,可能存在线程饥饿。ReentrantLock构造器源码: /** * Creates an instance of {@code ReentrantLock}. * Thi...原创 2019-01-10 15:07:49 · 218 阅读 · 0 评论 -
【十一】Java多线程J.U.C之 Countdownlatch
J.U.C是JDK 1.5提供的包 java.util.concurrentCountdownlatch允许一个或多个线程等待直到在其他线程中一组操作执行完成。Countdownlatch原理主线程TA调用await()后等待T1 T2 T3三个线程都执行了countDown,计数器cnt=0后,主线程开始继续执行。使用场景有任务A和任务B,任务B必须在任务A完成之后再做。...原创 2019-01-07 16:02:50 · 170 阅读 · 0 评论 -
【二十一】Java多线程J.U.C之AQS框架源码导读(总结、干货)(模板模式template pattern)
一、AQS的模板模式解读AbstractQueuedSynchronizer该类使用的设计模式是模板模式template pattern。在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。在AbstractQueuedSynchroniz...原创 2019-01-15 16:32:07 · 424 阅读 · 0 评论 -
【二十】Java多线程J.U.C之Fork/Join框架
JDK1.7引入的Fork/Join框架是基于工作窃取算法工作窃取算法工作窃取(work-stealing)算法是指某个线程从其他队列里窃取任务来执行。一个大任务分割为若干个互不依赖的子任务,为了减少线程间的竞争,把这些子任务分别放到不同的队列里,并为每个队列创建一个单独的线程来执行队列里的任务,线程和队列一一对应。比如线程1负责处理队列A里的任务,线程2负责队列B的。如果线程1...原创 2019-01-10 16:22:39 · 255 阅读 · 0 评论 -
【二】Java多线程创建方法(Runable、Thread、Callable)
1.实现Runable接口public class MyThread implements Runnable{ int count; String thrdName; MyThread(String name){ count = 0; thrdName = name; } public void run() { ...原创 2018-08-11 15:34:25 · 206 阅读 · 0 评论 -
【三】Java多线程确定线程结束(isAlive、join)
知道线程结束的方法1.isAlivepublic class MoreThread extends Thread { int count; String thrdName; MoreThread(String name){ count = 0; thrdName = name; } @Override pu...原创 2018-08-11 16:40:53 · 1279 阅读 · 0 评论 -
【四】Java多线程之线程优先级(Priority )
每个线程都有自己的优先级,优先级越高的线程得到CPU的分配的执行时间越多默认优先级是5,范围从1到10。public class Priority { public static void main(String[] args) { Thread t1 = new Thread(new T1()); Thread t2 = new Thread(n...原创 2018-08-11 17:17:14 · 513 阅读 · 0 评论 -
【五】Java多线程之线程同步synchronized(同步方法、同步代码块、偏向锁、轻量级锁、自旋锁、重量级锁、消除锁)
线程同步需要关键字synchronized来锁资源。有两种线程同步的方式1.同步化方法使用synchronized关键字修改方法来同步化对方法的访问。当调用方法时,调用线程进入对象监视器,对象监视器锁住对象(锁住synchronized修饰的那个方法的类的当前对象)。在对象被锁住的同时,其他线程不能进入该方法,也不能进入该对象定义的其他同步化方法,但是该对象的非同步化方法可以被...原创 2018-08-11 21:03:34 · 386 阅读 · 0 评论 -
【六】Java多线程之线程通信notify()、wait()、notifyAll()实现tick tock轮流输出
notify()、wait()、notifyAll()这些方法只能在同步化环境中被调用。wait()会释放当前锁,允许其他线程使用对象,让出CPU。notify()是通知一个线程获取锁notifyAll()虽然所有的线程都被通知了。但是这些线程都会进行竞争,且只会有一个线程成功获取到锁,在这个线程没有执行完毕之前,其他的线程就必须等待了(只是这里不需要再notifyAll通知了,因为已...原创 2018-08-11 22:42:36 · 212 阅读 · 0 评论 -
【七】Java多线程之线程暂停与终止,resume()、suspend()、stop()弃用,interrupt()简介
resume()、suspend()、stop(),这三个方法分别是重启线程、挂起线程、终止线程。这三个方法已经弃用。如果需要用到类似功能需要用flag来实现public class StopThreadTest { public static void main(String[] args) { StopThread r1 = new StopThread(...原创 2018-08-11 23:47:35 · 5631 阅读 · 2 评论 -
【八】Java多线程之线程池(Executors提供的4中线程池都有安全隐患、ThreadPoolExecutor总结)
一、ThreadPoolExecutor类java.uitl.concurrent.ThreadPoolExecutor类是线程池中最核心的一个类。ThreadPoolExecutor继承了AbstractExecutorService类1.构造方法4个,及其入参解释 public ThreadPoolExecutor(int corePoolSize, ...原创 2018-09-09 20:01:16 · 1295 阅读 · 0 评论 -
【九】Java多线程之Callable、Future和FutureTask
直接继承Thread或者实现Runnable接口、在执行完任务之后无法获取执行结果。从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果Callable介绍callable接口只有一个方法,call(),是线程实际的业务逻辑方法。@FunctionalInterface注解解释:是JDK 8 中新增的注解类型,用来描述一...原创 2018-11-20 11:32:03 · 307 阅读 · 0 评论 -
【十】Java多线程之 ThreadLocal及其ThreadLocalMap详解和内存泄漏解读
ThreadLocal一、简介不同的线程中,同一个ThreadLocal中的值的对象不一样,且其它 Thread 不可访问。ThreadLocal 适用于每个线程需要自己独立的实例且该实例需要在多个方法中被使用,也即变量在线程间隔离而在方法或类间共享的场景比如,ThreadLocal<StringBuilder> counter初始时为“”,A线程在其后追加0,对A线...原创 2018-11-26 13:34:21 · 957 阅读 · 0 评论 -
【十四】Java集合之ConcurrentHashMap源码分析(1.8)
一、简介java8中ConcurrentHashMap的结构是:数组+链表+红黑树。因为在hash冲突严重的情况下,链表的查询效率是O(n),所以jdk8中改成了单个链表的个数大于8时,数组长度小于64就扩容,数组长度大于等于64,则链表会转换为红黑树,这样以空间换时间,查询效率会变为O(nlogn)。红黑树在Node数组内部存储的不是一个TreeNode对象,而是一个TreeBin对...原创 2019-03-18 00:02:23 · 2555 阅读 · 4 评论