1.传统:synchronized
代码:
package com.qiu;
//基本的买票票的例子
/*
public static void main(String[] args) {
new Thread(new MyThread()).start();
}
static class MyThread implements Runnable{
@Override
public void run() {
}
}
*/
/**
* 真正的多线程开发,公司中的开发,降低偶和行
* 线程就是一个单独的资源类,没有任何的附属操作!
* 1.属性,方法
*
*/
public class SaleTicketDemmo01 {
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();
}
//资源类 OOP
static class Ticket{
//属性,方法
private int number =50;
//买票的方式
public void sale(){
if (number>0){
System.out.println(Thread.currentThread().getName()+"卖出了第"+(number--)+"张"+"剩余了"+number+"张");
}
}
}
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200427203531453.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyNDAwNzYz,size_16,color_FFFFFF,t_70)出现了多个线程争抢了同一个资源
解决方式 **public synchronized void sale(){**
- Lock锁
三个实现类:
公平锁:十分公平:可以先来后到
假设一个执行时间需要三分钟,一个执行时间需要三小时,如果说三小时在前面,3分钟再后面,则公平锁只会先执行3小时的起,再来执行3分钟的,这样就很不合适,所以说默认的就是不公平的.
非公平锁:十分不公平,可以插队(默认是非公平锁)
synchronized和Lock区别
1.synchronized是内置的关键字,Lock是一个java类
2.synchronized无法判断获取锁的状态,Lock可以判断是否获取到了锁
3.synchronized会自动释放锁, Lock必须要手动释放锁,如果不释放锁就会产生死锁
4.synchronized线程1(获得锁,阻塞),线程2会(等待,傻傻的等),Lock就不一定会等待下去.
5.synchronized 可重入锁,不可以中断的,非公平的.Lock,是可重入锁,可以判断锁,非公平(可以自己设置)
6.synchronized适合锁少量的代码同步问题,Lock适合锁大量的同步代码