Lock步骤:
1、new ReentrantLock()
2、lock.lock() 加锁
3、finally代码块中解锁 lock.unlock()
import java.util.concurrent.locks.Lock;
public class ReentrantLock {
public static void main(String[] args) {
Ticket2 ticket = new Ticket2();
new Thread(()->{for (int i=1;i<40;i++) ticket.sale();},"A").start();
new Thread(()->{for (int i=1;i<40;i++) ticket.sale();},"B").start();
new Thread(()->{for (int i=1;i<40;i++) ticket.sale();},"C").start();
}
}
/**
* Lock步骤:
* 1、new ReentrantLock()
* 2、lock.lock() 加锁
* 3、finally代码块中解锁 lock.unlock()
*/
class Ticket2{
private int number = 30;
Lock lock = new java.util.concurrent.locks.ReentrantLock();
public void sale(){
lock.lock(); //加锁
try {
//业务代码
if (number > 0){
System.out.println(Thread.currentThread().getName()+"卖出了"+
(number--)+"票,剩余:"+number);
}
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock(); //解锁
}
}
}
ReentrantLock精确解锁
多个线程之间按顺序调用,实现A->B->C三个线程启动,要求如下:
AA打印5次,BB打印10次,CC打印15次,紧接着AA打印5次,BB打印10次,CC打印15次,来10轮
class ShareResource{
private int number = 1;//A:1,B:2,C:3
private Lock lock = new ReentrantLock();
private Condition c1 = lock.newCondition();
private Condition c2 = lock.newCondition();
private Condition c3 = lock.newCondition();
public void print5(){
lock.lock();
try {
//1、判断
while (number !=1){
c1.await();
}
//2、干活
for (int i= 1;i<=5;i++){
System.out.println(Thread.currentThread().getName()+"\t"+i);
}
//3、通知
number = 2;
c2.signal();
}catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void print10(){
lock.lock();
try {
//1、判断
while (number !=2){
c2.await();
}
//2、干活
for (int i= 1;i<=10;i++){
System.out.println(Thread.currentThread().getName()+"\t"+i);
}
//3、通知
number = 3;
c3.signal();
}catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void print15(){
lock.lock();
try {
//1、判断
while (number !=3){
c3.await();
}
//2、干活
for (int i= 1;i<=15;i++){
System.out.println(Thread.currentThread().getName()+"\t"+i);
}
//3、通知
number = 1;
c1.signal();
}catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
public class ReentrantLockDemo {
public static void main(String[] args) {
ShareResource shareResource = new ShareResource();
new Thread(() -> {
for (int i = 1;i <= 10;i++){
shareResource.print5();
}
},"A").start();
new Thread(() -> {
for (int i = 1;i <= 10;i++){
shareResource.print10();
}
},"B").start();
new Thread(() -> {
for (int i = 1;i <= 10;i++){
shareResource.print15();
}
},"C").start();
}
}