Java JUC 高级线程之六 显示锁 Lock

版权声明:尊重原创,码字不易,转载需博主同意。 https://blog.csdn.net/qq_34626097/article/details/88920630

文章目录

显示锁 Lock

  1. 在Java 5.0之前,协调共享对象的访问时,可以使用的机制只有synchronized和volatile。Java 5.0后增加了一些新的机制,但并不是一种代替内置锁的方法,而是当内置锁不适用时,作为一种可选择的高级功能。
  2. ReentrantLock实现了Lock接口,并提供了与synchronized相同的互斥性和内存可见性,但相较于synchronized提供了更高的处理锁的灵活性。

Demo

/*
 * 一、可用于解决多线程安全问题的方式:
 * 
 * synchronized:隐式锁
 * 1. 同步代码块
 * 
 * 2. 同步方法
 * 
 * 3. 同步锁
 * 
 * jdk 1.5 后: 显示锁
 * 4. 同步锁 Lock
 * 注意:是一个显示锁,需要通过lock() 方法上锁,必须通过 unlock() 方法进行释放锁
 * 通常把 unlock() 放到finally中,以确保其执行释放锁。
 */
public class TestLock {
	public static void main(String[] args) {

		Ticket tick = new Ticket();

		for (int i = 0; i < 3; i++) {

			new Thread(tick).start();

		}
	}
}

class Ticket implements Runnable {

	private int tick = 100;

	private Lock lock = new ReentrantLock();

	@Override
	public void run() {

		while (true) {

			lock.lock();//上锁
			try {

				if (tick > 0) {

					try {
						Thread.sleep(200);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}

					System.out.println(Thread.currentThread().getName() + "完成售票,余票为:  " + --tick);
				}
			//注意:其必须写在finally里面,以保证线程进来之后都会释放锁。
			} finally {
				lock.unlock();//释放锁
			}
		}

	}

}

猜你喜欢

转载自blog.csdn.net/qq_34626097/article/details/88920630