使用Lock接口来解决线程安全的问题

package cn.itcast.demo16.Demo09.Lock;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
* @author newcityman
* @date 2019/7/24 - 20:38
* 解决线程安全问题的第三种方案:使用lock锁
* java.util.concurrent.locks.lock接口
* Lock实现提供了比使用synchronized方法和语句可获得的更广泛的锁定操作
* Lock接口中的方法:
* void lock()获取锁
* void unlock()释放锁
* java.util.concurrent.Locks.ReentrantLock implements Lock接口
*
* 使用步骤:
* 1、在乘员位置创建一个ReentrantLock implement Lock接口
* 2、在可能出现安全问题的代码前调用Lock接口中的lock方法获取锁
* 3、在可能出现安全问题的代码后调用Lock接口中的unLock方法释放锁
*/
public class RunnableImpl implements java.lang.Runnable {
private int ticket = 100;

Lock l = new ReentrantLock();

@Override
public void run() {
while (true) {
l.lock();
try {
Thread.sleep(10);
if (ticket > 0) {
System.out.println(Thread.currentThread().getName() + "--->正在卖" + ticket + "张票");
ticket--;
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
l.unlock();
}
}
}
}



package cn.itcast.demo16.Demo09.Lock;

/**
* @author newcityman
* @date 2019/7/24 - 20:44
*/
public class Demo01TicketLock {
public static void main(String[] args) {
RunnableImpl impl = new RunnableImpl();
Thread t1 = new Thread(impl);
Thread t2 = new Thread(impl);
Thread t3 = new Thread(impl);

t1.start();
t2.start();
t3.start();
}
}
原文地址:https://www.cnblogs.com/newcityboy/p/11240938.html