1.线程有几种状态
public enum State {//新生NEW,//运行RUNNABLE,//阻塞BLOCKED,//等待WAITING,//超时等待TIMED_WAITING,//终止TERMINATED;}
2.wait和sleep的区别
1.来自不同的类
wait=>Object类
sleep => Thread类
2.关于锁的释放
wait 会释放锁,
sleep 睡觉了,抱着锁睡觉,不会释放!
3.使用的范围是不同的
wait 必须在同步代码块中使用
sleep 可以在任何地方睡
4.是否可以需要捕获异常 都是中断异常
wait 需要捕获异常
sleep 也需要抛出异常
3.Lock锁(重点)
1.传统Synchronized
package com.kuang.lock;
//基本的卖票例子/*** 真正的多线程开发,公司中的开发,降低耦合性* 线程就是一个单独的资源类,他没有任何附属的操作!* 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();}}// 资源类 OOP
class Ticket{// 属性、方法private int number=50;//卖票的方式public synchronized void sale(){if (number>0){System.out.println(Thread.currentThread().getName()+":卖出第"+(number--)+"张票,还剩"+number+"张票");}}}
2.lock接口
new FairSync()公平锁
new NonfairSync()非公平锁
公平锁:十分公平,可以先来后到
非公平锁:十分不公平,可以插队(默认)
3秒 和 3小时的 如果公平锁 3秒中必须等3小时之后才能执行,
但是插队的话,就是谁抢到,谁执行,而且是有锁的。
package com.kuang.lock;import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class SaleTicketDemo02 {public static void main(String[] args) {//并发:多线程操作同一个资源类,把资源类丢入线程。Ticket2 ticket = new Ticket2();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
class Ticket2 {// 属性、方法private int number = 50;//卖票的方式//lockLock 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();//解锁}}
}
3.Synchronized 和 Lock 区别
- Synchronized 内置的Java关键字,Lock是个 Java接口类。
- Synchronized 无法判断获取所得状态,Lock 可以判断是否获取到了锁。
- Synchronized 会自动释放锁,Lock必须要手动释放锁!如果不释放锁,死锁!
- Synchronized 线程1(获得锁,阻塞),线程2(等待,傻傻的等);Lock锁就不一定会等待下去;
- Synchronized 可重入锁,不可以中断的,非公平;Lock锁,可重入锁,可以 判断锁,非公平(可以自己设置);
- Synchronized 适合锁少量的代码同步问题,Lock适合锁大量的同步代码!
提问?:锁是什么?如何判断锁的是谁!