1、什么是JUC
JUC是java.util.concurrent包的简称,在Java5.0添加,目的就是为了更好的支持高并发任务。让开发者进行多线程编程时减少竞争条件和死锁的问题!
2、线程和进程
进程:一个程序,比如QQ.exe,WeChat.exe
一个进程往往包含多个线程,至少会包含一个!!!
Java默认会开启两个线程,一个是main,一个是GC回收
Java能否开启线程?不能
public synchronized void start() {
...
group.add(this);
boolean started = false;
try {
start0();
started = true;
} finally {
...
}
}
// 是一个本地方法,调用C++来开启线程,Java不能调用硬件
private native void start0();
并发和并行
并发:同一个时刻,多个任务交替进行(单核CPU实现的多任务就是并发),多个线程操作同一个资源类
并行:同一时刻,多个进程同时运行(多核CPU同时处理多个任务)
public static void main(String[] args) {
// 获取CPU的核数
// 后边会说CPU密集型和IO密集型
System.out.println(Runtime.getRuntime().availableProcessors());
}
线程的几个状态
根据jdk源码可以看到,有6种状态
public enum State {
// 新生状态
NEW,
// 运行状态
RUNNABLE,
// 阻塞状态
BLOCKED,
// 等待状态
WAITING,
// 超时等待
TIMED_WAITING,
// 终止
TERMINATED;
}
wait/sleep的区别
1、来自不同的类
wait -> Object
sleep -> Thread
2、关于锁的释放
wait会释放锁
sleep不会释放锁
3、使用的范围
wait必须在同步代码块中
sleep可以在任意地方休眠
3、Lock锁(重点)
synchronized
synchronized互斥锁(非公平锁)
,使用方式
// 同步代码块方式
//1、同步非静态锁,可以是this,也可以是其他的对象,但要求是同一个对象
//2、同步静态锁为当前类本身,即类.class
synchronized (对象){
同步操作;
}
// 同步方法
public synchronized void method(){
同步操作;
}
以卖票为例
public class SaleTicketDemo01 {
public static void main(String[] args) {
// 并发编程,多个线程操作同一个资源类,将资源类丢入到线程中
Mac mac = new Mac();
// @FunctionalInterface 函数式接口,在jdk1.8中使用了Lambda表达式(参数)->{代码}
new Thread(()->{
for (int i = 0; i < 60; i++) {
mac.sale();
}
},"A").start();
new Thread(()->{
for (int i = 0; i < 60; i++) {
mac.sale();
}
},"B").start();
new Thread(()->{
for (int i = 0; i < 60; i++) {
mac.sale();
}
},"C").start();
}
}
// 资源类 OOP
class Mac{
// 类中只包含属性、方法
private int num = 50;
//卖票的方式
void sale(){
// synchronized 本质就是一个非公平锁
synchronized (this){
if(num > 0) {
System.out.println(Thread.currentThread().getName() + "卖出了:" + (num--) + ",剩余" + num);
}
}
}
}
Learning
标签:JUC,Thread,synchronized,void,线程,sleep,public From: https://www.cnblogs.com/porterdong/p/16953218.html