线程间的共享 synchronized 和 volatile 关键字
synchronized 是 Java 内建的同步机制,所以也有人称其为 Intrinsic Lock(内在锁),它提供了互斥的语义和可见性,当一个线程已经获取当前锁时,其他试图获取的线程只能等待或者阻塞在那里。
在 Java 5 以前,synchronized 是仅有的同步手段,在代码中,synchronized 可以用来修饰方法,也可以使用在特定的代码块上,本质上 synchronized 方法等同于把方法全部语句用 synchronized 块包起来。
ReentrantLock(再入锁),是 Java 5 提供的锁实现,它的语义和 synchronized 基本相同。再入锁通过代码直接调用 lock() 方法获取,代码书写也更加灵活。ReentrantLock 提供了很多实用方法,能够实现很多 synchronized 无法做到的细节控制,比如可以控制 fairness(公平性),或者利用定义条件等。但是,编码中也需要注意,必须要明确调用 unlock() 方法释放,不然就会一直持有该锁。
synchronized 和 ReentrantLock 的区别
- synchronized是关键字,ReentrantLock是类
- ReentrantLock可以对获取锁的等待时间进行设置,避免死锁
- ReentrantLock可以获取各种锁的信息
- ReentrantLock可以灵活的实现多路通知
ReentrantLock 使用示例:
public class ReentrantLockDemo implements Runnable {
ReentrantLock lock = new ReentrantLock(true);
@Override
public void run() {
while (true) {
try {
lock.lock();
System.out.println(Thread.currentThread().getName() + " get lock");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
public static void main(String[] args) {
ReentrantLockDemo lockDemo = new ReentrantLockDemo();
Thread thread1 = new Thread(lockDemo);
thread1.start();
Thread thread2 = new Thread(lockDemo);
thread2.start();
}
}