Java 并发编程:Java 中的进程和线程 - Java 线程同步
最编程
2024-03-27 10:03:12
...
Java中实现线程同步的方式有以下几种,以具体使用的方式来举例,第一类是使用锁,使用锁会使运行效率降低:
- 关键字synchronized,可以修饰同步代码块和同步方法,Java的每个对象都有一个内置锁,当用此关键词修饰方法时,内置锁会保护整个方法,在调用该方法前,需要获取内置锁,否则就处于阻塞状态,被该关键字修饰的语句块会自动被加上内置锁,从而实现同步。
-
JUC包-使用重入锁类实现线程同步,在JavaSE5.0中新增了一个
java.util.concurrent
包来支持同步。ReentrantLock类可重入、互斥,实现了Lock接口的锁,它与使用synchronized方法和快具有相同的基本行为和语义,并且扩展了其能力
第二类是使用一些特殊机制避免使用锁,但是可能需要额外开销或功能阉割。
- 关键字volatile及JMM内存模型,修饰共享变量,保持数据可见性,volatile关键字为域变量的访问提供了一种免锁机制。要了解具体用法,需要掌握JMM内存。
- 使用局部变量实现线程同步,如果使用ThreadLocal管理变量,则每一个使用该变量的线程都获得该变量的副本,副本之间相互独立,这样每一个线程都可以随意修改自己的变量副本,而不会对其他线程产生影响
第三类是在实现层面上考量而非底层实现机制上考量:
-
JUC包-使用并发集合类实现线程同步,使用
LinkedBlockingQueue<E>
来实现线程的同步LinkedBlockingQueue<E>
是一个基于已连接节点的,范围任意的blocking queue。队列是先进先出的顺序,类似Redis的list实现方式
第四类是我们干脆使用操作原子性的线程安全的类来使用就不用考虑同步问题了
- JUC包-原子类,需要使用线程同步的根本原因在于对普通变量的操作不是原子的。那么什么是原子操作呢?原子操作就是指将读取变量值、修改变量值、保存变量值看成一个整体来操作,即-这几种行为要么同时完成,要么都不完成
依据以上的线程同步方式,接下来本系列的行文布局会分为三大块:
- 锁机制,Java中的锁分类以及synchronized关键字,它的实现原理和机制、Java中锁的种类切换、死锁的现象和避免,JUC并发包下的高级锁的使用方式
- JMM内存模型,JMM内存模型、volatile关键字、ThreadLocal的实现方式
- JUC并发包下 并发集合类的使用方式、线程池的使用方式、原子类的使用方式
那么接下来正式开启线程同步实现方式的探索之旅吧!
总结
本篇Blog初步介绍了什么是进程和线程、线程的优势和问题;基于这些抽象的概念,我们来看Java中的多线程具体实现方式和线程同步的实现方式,所以我们需要掌握Java线程调度的实现以及Java同步方法,这也是后续几篇Blog的行文逻辑。