Lock是一个接口
ReentrantLock
、ReentrantReadWriteLock.ReadLock
、ReentrantReadWriteLock.WriteLock
ReentrantLock
有两个构造方法
公平锁:先来后到
非公平锁:可以插队,根据cpu调度
Lock
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class SaleTicketDemo_Lock {
public static void main(String[] args) {
//并发:多线程操作同一个资源类,把资源类丢入线程
Ticket02 ticket = new Ticket02();
new Thread(()->{ for (int i = 0; i <400 ; i++) ticket.Sale(); },"A").start();
new Thread(()->{ for (int i = 0; i <400 ; i++) ticket.Sale(); },"B").start();
new Thread(()->{ for (int i = 0; i <400 ; i++) ticket.Sale(); },"C").start();
}
}
//Lock
//卖票的方式
class Ticket02{
//属性、方法
private int number=300;
//1.通过ReentrantLock类,实例化接口Lock
Lock l =new ReentrantLock();
public void Sale(){
l.lock();//2.加锁
try {
//3.业务代码
if (number>0){
System.out.println(Thread.currentThread().getName()+"卖出了第"+(number--)+"还剩"+(number)+"张");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//4.解锁
l.unlock();
}
}
}
Synchronized
public class SaleTicketDemo_Synchronized {
public static void main(String[] args) {
//并发:多线程操作同一个资源类,把资源类丢入线程
Ticket ticket = new Ticket();
new Thread(()->{ for (int i = 0; i <400 ; i++) ticket.Sale(); },"A").start();
new Thread(()->{ for (int i = 0; i <400 ; i++) ticket.Sale(); },"B").start();
new Thread(()->{ for (int i = 0; i <400 ; i++) ticket.Sale(); },"C").start();
}
}
//Synchronized
//资源类 OOP
class Ticket{
//属性、方法
private int number=300;
//卖票的方式
public synchronized void Sale(){
if (number>0){
System.out.println(Thread.currentThread().getName()+"卖出了一张票,还剩"+(number--)+"张");
}
}
}