Java对并发编程的支持历史 我会带着你远行 2022-08-29 09:55 149阅读 0赞 ## 1. JDK1.4及之前 ## 在JDK1.4及之前的版本,主要提供的并发技术有: * synchronized关键字 * volatile关键字 * 不变模式(不可变类) ### 1.1 volatile关键字[\#][Link 1] ### 引用百度百科的解释: > volatile是一个类型修饰符(type specifier),就像大家更熟悉的const一样,它是被设计用来修饰被不同线程访问和修改的变量。volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。 注:百度百科的解释并不是专门针对java语音中的volatile,而是C语音,不过其设计思想类型,可以拿来借鉴。 更通俗易懂的说法,在Java语音中,使用volatile关键字的目的: * 标识这个变量是易变型变量 * 保证这个变量的可见性 * 保证一定的有序性 volatile关键字还涉及到JMM(Java内存模型,Java Memory Model)以及并发的三个特性(原子性、有序性和可见性),关于volatile关键字的更多内容,计划在后续章节中进行更加详细的学习。 ### 1.2 synchronized关键字 ### 引用百度百科的一段解释: > synchronized 关键字,代表这个方法(或代码块)加锁,相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程B(或者C、 D等)正在用这个方法(或者该类的其他同步方法),有的话要等正在使用synchronized方法的线程B(或者C 、D)运行完这个方法后再运行此线程A,没有的话,锁定调用者,然后直接运行。它包括两种用法:synchronized 方法 和 synchronized 代码块 。 简单来说,synchronized关键字以同步方法和同步代码块的方式,为方法和代码块上的对象加锁。使得同一时刻,在这个对象上的多个线程,只能由持有这个对象锁的单个线程进行代码的调用执行。 synchronized 关键字能够保证代码的原子性、可见性和有序性。 关于synchronized关键字的更多内容,计划在后续章节中进行更加详细的学习。 ### 1.3 不变模式[\#][Link 2] ### 所谓不变模式,就是指:在并发编程中,为确保数据的一致性和正确性,使用一种不可改变的对象。依靠其不可变的性质,来确保在没有同步的情况下依旧保持一致性和正确性。 Java中不变模式相关技术有: * final关键字 * String类型 关于不变模式,就简单进行这些介绍。如果感兴趣,可以自行学习。 ## 2. JDK5 ## 众所周知,JDK5是Java发展的一个重要版本,提供了很多技术,如泛型 Generic、枚举类型 Enumeration、可变参数varargs、注解 Annotations等等。 在JDK1.5版本中,也提供了对并发编程极为重要的一个包:java.util.concurrent(并发包) java.util.concurrent(并发包)提供了一些列较为给力的并发技术,主要有: * 原子(Atomic)类型:如AtomicInteger、AtomicReference等,保证变量的原子性和可见性。 * 显式锁(Lock)接口:对之前版本锁机制的重构,相较于synchronized 关键字,能够提供更加灵活的特性,如:能够指定锁定公平性、可以实现分组唤醒(Condition)、性能更好的锁。主要包括:Lock接口、ReadWriteLock接口和Condition接口。 * 计数器(CountDownLatch):利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行。 * 回环栅栏(CyclicBarrier):通过它可以实现让一组线程等待至某个状态之后再全部同时执行。叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用。 * 信号量(Semaphore):Semaphore可以控同时访问的线程个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。 * 并发集合:即集合类在并发环境下的版本。主要有:BlockingQueue(Queue)、ConcurrentMap(Map)、ConcurrentHashMap(HashMap)、CopyOnWriteArrayList(ArrayList)。 * Callable和Future接口:为了解决继承Thread类和实现Runnable接口存在的弊端(不允许声明检查型异常,不能定义返回值),而引入的线程的新的定义方式。 * 执行器(Executor接口):Executors相关类隐藏了如何处理Runnable的细节,提供了一组方法,能够创建拥有完善配置的线程池和executor。 关于原子(Atomic)类型、显式锁(Lock)接口、并发集合、Callable和Future接口、执行器(Executor接口)的更多内容,计划在后续章节中进行更加详细的学习。 ## 3. JDK7 ## 在JDK1.7版本中,主要提供的并发编程技术有: * TransferQueue:比BlockingQueue性能更好的并发集合实现。 * 分支合并(Fork/Join)框架:运用分治法(divide-and-conquer)的思想,实现线程池中任务的自动调度,并且这种调度对用户来说是透明的,典型应用ForkJoinPool。 关于分支合并(Fork/Join)框架的更多内容,计划在后续章节中进行更加详细的学习。 ## 4.JDK8 ## 在JDK.18版本中,主要提供的并发编程技术有: * 加法器(Adder)和累加器(Accumulator):原子类型的扩充与优化,主要有:LongAdder、LongAccumulator、DoubleAdder和DoubleAccumulator,比AtomicLong和AtomicDouble性能更优。 * CompletableFuture:JDK5中Future的增强版。 * StampedLock:JDK5中ReadWriteLock的改进版。 [Link 1]: https://www.cnblogs.com/54chensongxia/p/11935356.html#11-volatile%E5%85%B3%E9%94%AE%E5%AD%97 [Link 2]: https://www.cnblogs.com/54chensongxia/p/11935356.html#13-%E4%B8%8D%E5%8F%98%E6%A8%A1%E5%BC%8F
相关 Java对并发编程的支持:常见问题与解决方案 Java对并发编程提供了强大的支持,主要体现在以下几个方面: 1. 线程库: - Thread类:用于创建和操作线程。 - Executor服务:管理多线程的执行 电玩女神/ 2024年10月25日 01:45/ 0 赞/ 16 阅读
相关 应对并发高峰:Java高并发编程实战案例 Java作为一种流行的编程语言,尤其在处理高并发场景时表现出色。以下是一些Java高并发编程的实战案例: 1. **多线程池**: - Redis Cluster: 利 Bertha 。/ 2024年09月10日 09:24/ 0 赞/ 49 阅读
相关 Java并发编程的艺术-Java并发编程基础 第4章 Java并发编程基础 Java从诞生开始就明智地选择了内置对多线程的支持,这使得Java语言相比同一时期的其他语言具有明显的优势。线程作为操作系统调度的最... 小鱼儿/ 2024年04月17日 05:42/ 0 赞/ 76 阅读
相关 Java对并发编程的支持历史 1. JDK1.4及之前 在JDK1.4及之前的版本,主要提供的并发技术有: synchronized关键字 volatile关键字 不变模式(不可变 我会带着你远行/ 2022年08月29日 09:55/ 0 赞/ 150 阅读
相关 VC2010增加对并发的支持 笔记一 struct DoWrite { DoWrite(Concurrency::critical_section &cs,std::list<int> & 左手的ㄟ右手/ 2022年06月17日 00:26/ 0 赞/ 195 阅读
相关 Ehcache(07)——Ehcache对并发的支持 Ehcache对并发的支持 在高并发的情况下,使用Ehcache缓存时,由于并发的读与写,我们读的数据有可能是错误的,我们写的数据也有可能意外的被覆盖。所 梦里梦外;/ 2022年06月16日 09:50/ 0 赞/ 189 阅读
相关 Ehcache(07)——Ehcache对并发的支持 Ehcache对并发的支持 在高并发的情况下,使用Ehcache缓存时,由于并发的读与写,我们读的数据有可能是错误的,我们写的数据也有可能意外的被覆盖。所 拼搏现实的明天。/ 2022年05月17日 02:47/ 0 赞/ 168 阅读
相关 java多线程并发之旅-02-java 并发编程的历史 1.并发的发展历史 其实,在早期计算机并没有包含操作系统,这个时候,这个计算机只跑一个程序,这个程序独享计算机的所有资源,这个时候不存在什么并发问题,但是对计算机的资源来 叁歲伎倆/ 2022年02月26日 04:11/ 0 赞/ 229 阅读
相关 Java编程发展历史 Java的由来 Java语言的诞生具有一定的戏剧性,它并不是经过精心策划、制作、最后残生的划时代产品,从某个角度来说,Java语言的诞生完全是一种误会,美丽的误会。 淡淡的烟草味﹌/ 2021年09月22日 23:06/ 0 赞/ 411 阅读
还没有评论,来说两句吧...