java多线程发展历程
Sun公司在1995年年初发布了Java语言。
Sun在1996年年初发布了JDK1.0,包含java.io、 java.util、java.NET、java.awt和java.applet
确立了Java最基础的线程模型------抢占式。两种常见的进程/线程调度方式,即抢占式和协作式
线程间的协作通信采用简单粗暴的stop/resume/suspend这样的方法。
线程模型中最核心的两个类Thread和ThreadUsage这样的类。
Sun在1997年2月18日发布了JDK1.1。
1998年12月,Sun发布了Java历史上最重要的JDK版本:JDK1.2。
在这个版本中,Java试图用Swing修正在AWT中犯的错误,例如使用了太多的同步。
正式废除了三个方法:stop()、suspend()和resume(),使用wait()、notify() 和 sleep()。
引入线程变量ThreadLocal类。
2002年,Sun发布了JDK历史上最成熟的版本:JDK1.4
JDK在原有标准IO的基础上,提供了一组多路复用IO的解决方案NIO,相较于面向流的传统方式,这种面向块的访问方式会丢失一些简易性和灵活性。
(通过统一的轮询线程检测,每当有数据到达,触发监听事件,将事件分发出去,只有在对资源争夺剧烈的高并发场景下,才能见到NIO的明显优势)
2004年10月,Sun发布了万众期待的JDK1.5。Sun将JDK1.5改名为Java SE5.0
JSR 133和JSR 166的正式发布。
JSR 133重新明确了Java内存模型,JSR 133指定的先行发生(Happens-before)使得执行指令的顺序变得灵活
(在这之前,常见的内存模型包括连续一致性内存模型和先行发生模型。)
通过对synchronized、volatile和final这几个语义被增强的关键字的使用,可以做到数据一致性。
JSR 166的贡献就是引入了java.util.concurrent这个包。新增最右边一列
一些框架与方法
Executors线程池框架 ,用来创建各种线程池。newFixedThreadPool newCachedThreadPool 、newSingleThreadExecutor ScheduledExecutorService 等线程池
Callable接口和Futrue ;
并发工具类Semaphore与Exchanger;
Semaphore 可以在多个线程并发时指定同时执行线程的个数;
Exchanger 可以在多线程并发时设置等待,等待另一线程运行到指定位置,并且交换数据。
ReentrantLock、ReentrantReadWriteLock 、Condition Lock实现lock接口 可以自主的对锁实现更精细的操作
使用Condition Lock时可以创建多个分支对象,让线程在不同的分支上等待,并且可以唤醒指定分支上的线程
2006年12月,Sun公司发布了JDK1.6(也被称为Java EE 6)。
对锁做了一些优化,锁自旋、锁消除、锁合并、轻量级锁、所偏向等。
CyclicBarrier类用于流程控制,对多个线程的控制,保证多个任务在并行执行都完成的情况下,多个线程再统一执行下一步操作
CountDownLatch(使用倒数计数的方式),对单个线程,即多个线程全部完成后,由一个线程去执行下一步操作。
2009年4月20日,Oracle收购Sun公司。
2011年7月28日,Oracle公司发布了 Java SE 7。
完善了并发流程控制的功能,比如fork-join框架。
Phaser这个类;NIO2的新开放特性
20
14年3月18日,Oracle公司发布了Java SE8。
LongAdder和AtomicLong使用了原子操作来提高性能
CompletableFuture实现CompletionStage接口,是Java 8中对Future的增强版。
StampedLock是ReadWriteLock的一个改进,偏向于写线程的改进。(StampedLock认为读不应阻塞写)
2017年9月22日,Oracle公司发布了Java SE 9。
改善锁争用机制
2018年3月21日,发布JDK10
2018年9月25日,发布JDK11
2019年3月19日,发布JDK12
2019年9月17日, 发布JDK13
2019年9月17日, 发布JDK13
参考博客https://blog.csdn.net/man_8211/article/details/72885018