1、什么是JUC
:::tips ::: java.util 工具包 :::tips
:::
2、线程和进程
进程:一个程序,程序的集合;
一个进程可以包含多个线程,至少包含一个
Java默认有几个线程:main、GC
线程:对于Java而言,Thread、Runable、Callable
Java真的可以开启多个线程吗
不可以,只能通过native方法进行调用,java无法操作硬件
并发:同一时间段
并行:同一时间(必须多核)
//获取CPU的核数
//CPU密集型,IO密集型
System.out.println(Runtime.getRuntime().availableProcessors());
并发编程的本质:充分利用cpu的资源
线程有几个状态
共6个
public enum State {
//新生
NEW,
//运行
RUNNABLE,
//阻塞
BLOCKED,
//等待,死死的等
WAITING,
//超时等待
TIMED_WAITING,
//终止
TERMINATED;
}
wait/sleep的区别
1、来自不同的类
wait — Object
sleep — Thread
2、关于锁的释放
wait会释放锁,sleep抱着锁睡觉,不会释放
3、使用的范围不同
- wait 必须在同步代码块中睡
- sleep 可以在任何地方睡
4、异常的捕获
wait 不需要捕获异常 目前需要捕获了
sleep 必须捕获异常
3、Lock锁
一个接口和三个实现类
代码实现
通过构造方法来定义是否为公平锁
- 公平锁:十分公平,先来后到
- 非公平锁:十分不公平,可以插队(默认)
传统Synchronized
class Ticket{
private int num=50;
public synchronized void sale(){
if(num>0){
System.out.println(Thread.currentThread().getName()+"卖出了"+(num--));
}
}
}
Lock
//Lock锁
class Ticket2{
private int num=50;
Lock lock = new ReentrantLock();
public synchronized void sale(){
lock.lock();
try {
if(num>0){
System.out.println(Thread.currentThread().getName()+"卖出了"+(num--));
}
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
区别:
:::tips
1、Synchronized 是内置的关键字,Lock是一个java类
2、Synchronized 无法获取锁的状态,Lock可以判断是否获取到了锁
3、Synchronized 会自动释放锁,Lock锁必须要释放锁,否则会死锁
4、Synchronized 线程之间串行执行,一个阻塞,影响后续;Lock就不一定
5、Synchronized 可重入锁,不可以中断,非公平;Lock,可重入,可以自己设置公平性
6、Synchronized 时候锁少量的代码同步问题,Lock适合大量的同步代码
:::