【Java】の基础——几种线程同步方式

来源:互联网 发布:linux装java环境 编辑:程序博客网 时间:2024/05/17 23:01

  • synchronized关键字
      • 特点
  • ReentrantLock类
      • 特点
  • waitnotifyAll 方式
  • ThreadLocal
  • Semaphore
  • volatile关键字

synchronized关键字

  • 可以修饰方法、对象、成员变量
  • 是可重入锁
  • 可以说是一个几种锁过程的封装:偏向锁、轻量锁、对象锁,自旋锁

特点

  • 不可定时
  • 不可中断

ReentrantLock类

可重入锁。(对于同一个线程,可以继续调用加锁的方法,而不会被挂起)

特点

  • 可以设置超时时间
  • 可以使用多个Condition
  • 可以选择公平锁和非公平锁
  • 可以获得正在等待线程的个数,计数器等

wait/notifyAll 方式

java中每个对象都拥有一个内置锁。

ThreadLocal

将每一个线程存取数据的行为加以隔离,实现的方法就是给予每个线程一个特定空间来保管该线程所独享的资源。
它主要由四个方法组成initialValue(),get(),set(T),remove()。

ThreadLocal是如何做到为每一个线程维护变量的副本的呢?其实实现的思路很简单:在ThreadLocal类中有一个Map,用于存储每一个线程的变量副本,Map中元素的键为线程对象,而值对应线程的变量副本。

Semaphore

Semaphore信号量被用于控制特定资源在同一个时间被访问的个数。

volatile关键字

保证线程间对统一变量可见性。
禁止指令重排序。
Volatile变量可以确保先行关系,即写操作会发生在后续的读操作之前, 但它并不能保证原子性。