JUC学习-1-JUC简介-Synchronized 和 Lock
这就是JUC
传统的方法在多线程的情况下就会有并发的问题
public class SaleTicketDemo01 {
public static void main(String[] args) {
// 并发 多个线程操作同一个资源类 把资源丢入线程
Ticket ticket = new Ticket();
new Thread(() -> {
for (int i = 0; i < 40; i++) {
ticket.sale();
}
}, "A").start();
new Thread(() -> {
for (int i = 0; i < 40; i++) {
ticket.sale();
}
}, "B").start();
new Thread(() -> {
for (int i = 0; i < 40; i++) {
ticket.sale();
}
}, "C").start();
}
}
//资源类
class Ticket {
private int number = 30;
private int orderNUmber = 0;
// 买票的方式
public void sale() {
if (number > 0) {
System.out.println(Thread.currentThread().getName() + "卖出了" + ++orderNUmber + "张票,剩余:" + --number);
}
}
}
最简单的方式 synchronized
//资源类 class Ticket { private int number = 30; private int orderNUmber = 0; // 买票的方式 public synchronized void sale() { if (number > 0) { System.out.println(Thread.currentThread().getName() + "卖出了" + ++orderNUmber + "张票,剩余:" + --number); } } }
Lock 加锁 锁分为三类
锁又分为公平锁和非公平锁,公平锁按照顺序排序,不可插队,非公平锁,按照cpu调度 Java默认是非公平锁
Synchronized 和Lock 的区别
Synchronized 是内置的Java关键字 Lock是一个Java类
Synchronized 无法判断获取锁的状态 lock可以判断是否获取到了锁
synchronized 会自动释放锁 lock必须要手动释放锁 如果不释放锁 (死锁)
synchronized 线程1(获得锁,阻塞) 线程2(等待,一直等待) Lock不一定会等待下去 (tryLock())
synchronized 可重入锁 不可以中断的 非公平锁 Lock 可重入锁 可以判断锁 非公平(可以设置)
synchronized 适合少量的代码同步问题 lock适合大量的同步代码