以卖票为例
//基本的卖票例子/*真正的多线程开发,公司中的开发,降低耦合性线程就是一个单独的资源类,没有任何附属的操作1.属性、方法*/
public class SaleTicketDemo01 {public static void main(String[] args) {//多个线程操作同一个资源类Ticket ticket = new Ticket();//@FunctionalInterface 函数式接口,jdk1.8 lambda表达式 (参数)->{ 代码 }new Thread(()->{for (int i = 0; i < 60; i++) {ticket.sale();}},"A").start();new Thread(()->{for (int i = 0; i < 60; i++) {ticket.sale();}},"B").start();new Thread(()->{for (int i = 0; i < 60; i++) {ticket.sale();}},"C").start();}}class Ticket {//属性、方法private int number = 50;//卖票的方式//synchronized 本质:队列,锁public synchronized void sale(){if (number>0){System.out.println(Thread.currentThread().getName()+"卖出了1张票,剩余"+--number+"张票");}}}
需要手动加锁,释放锁
Lock锁是一个接口,他有三个实现类:
以卖票为例
//基本的卖票例子import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;/*真正的多线程开发,公司中的开发,降低耦合性线程就是一个单独的资源类,没有任何附属的操作1.属性、方法*/
public class SaleTicketDemo02 {public static void main(String[] args) {//多个线程操作同一个资源类Ticket2 ticket = new Ticket2();//@FunctionalInterface 函数式接口,jdk1.8 lambda表达式 (参数)->{ 代码 }new Thread(()->{for (int i = 0; i < 5; i++) {ticket.sale();}},"A").start();new Thread(()->{for (int i = 0; i < 5; i++) {ticket.sale();}},"B").start();new Thread(()->{for (int i = 0; i < 5; i++) {ticket.sale();}},"C").start();}}class Ticket2 {//属性、方法private int number = 15;Lock lock = new ReentrantLock();//lock三部曲//1. new ReentrantLock()//2.lock.lock(); //加锁//3.finally =>lock.unlock(); //解锁public synchronized void sale(){lock.lock(); //加锁try {//业务代码if (number>0){System.out.println(Thread.currentThread().getName()+"卖出了1张票,剩余"+--number+"张票");}} catch (Exception e) {e.printStackTrace();} finally {lock.unlock(); //解锁}}}