3.1、传统Synchronized
package com.chen.demo01;
// 基本的卖票例子
/**
* 真正的多线程开发,公司中的开发,降低耦合性
* 线程就是一个单独的资源类,它没有任何的附属操作!
* 1、属性、方法
*/
public class SaleTicketDemo01 {
public static void main(String[] args) {
// 并发,多线程操作同一个资源类
Ticket ticket = new Ticket();
// @FunctionalInterface 函数时接口,jdk1.8 lambda表达式(参数)-{代码}
new Thread(()->{
for (int i = 1; i < 60; i++) {
ticket.sale();
}
},"A").start();
new Thread(()->{
for (int i = 1; i < 60; i++) {
ticket.sale();
}
},"B").start();
new Thread(()->{
for (int i = 1; i < 60; i++) {
ticket.sale();
}
},"C").start();
}
}
// 资源类
class Ticket{
// 属性、方法
private int number = 50;
// 卖票的方式 本质:队列,锁
public synchronized void sale(){
if (number > 0){
System.out.println(Thread.currentThread().getName()+"卖出了第"+ number-- +"张票,剩余"+number);
}
}
}
3.2、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();
new Thread(()->{
for (int i = 1; i < 60; i++) {
ticket.sale();
}
},"A").start();
new Thread(()->{
for (int i = 1; i < 60; i++) {
ticket.sale();
}
},"B").start();
new Thread(()->{
for (int i = 1; i < 60; i++) {
ticket.sale();
}
},"C").start();
}
}
// lock三部曲
// new ReentrantLock();
// lock.lock(); //加锁
// lock.unlock(); // 解锁
// Lock
class Ticket2{
// 属性、方法
private int number = 50;
Lock lock = new 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(); // 解锁
}
}
}
2.3、Synchronized 和 Lock 区别
1、Synchronized 内置的java关键字, lock是一个java类。
2、Synchronized 无法判断获取锁的状态,Lock 可以判断是否获取到了锁
3、Synchronized 全自动释放锁,lock必须要手动释放锁!如果不释放锁,死锁
4、Synchronized 线程1(获得锁,阻塞)、线程2(等待,傻傻的等);Lock锁就不一定会等待下去;
5、Synchronized 可重入锁,不可以中断的,非公平; Lock,可重入的,可以判断锁,公不公平可以自己设置
6、Synchronized 适合少量的代码同步问题,Lock锁适合锁大量的同步代码!
2.4、锁是什么
通过8个关于锁的问题来深入了解什么是锁,锁的是谁
链接https://editor.youkuaiyun.com/md/?articleId=109404639