这个知识点面试中被问到过,觉得还是要多学习学习,也比较重要!!!! JUC的一些知识点 主要是java的三个包
> java.util.concurrent
> java.util.concurrent.atomic
> java.util.concurrent.locks
juc并发编程主要是在一些多线程里使用: 一个进程至少包含一个线程 java默认有两个
-
main -
GC
JAVA主要是通过调用本地方法来开启线程!(start0())
wait和sleep的区别
1.来自不同的类
wait==>object
sleep==>Thread
2.锁的释放
wait会释放锁
sleep不会
3.使用范围
wait必须在同步代码块
sleep可以在任意地方
4.异常
wait不需要捕获
sleep必须捕获异常
sychronized
Lock锁(重点!!!) 实现对象
- reentrantLock (可重入锁)
- ReadLock
- WriteLock
默认非公平锁!!
synchronized和lock的区别
1.首先synchronized是java内置关键字,在jvm层面,Lock是个java(接口);
2.synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁;
3.synchronized会自动释放锁(a 线程执行完同步代码会释放锁 ;b 线程执行过程中发生异常会释放锁),Lock需在finally中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁;
4.用synchronized关键字的两个线程1和线程2,如果当前线程1获得锁,线程2线程等待。如果线程1阻塞,线程2则会一直等待下去,
而Lock锁就不一定会等待下去,如果尝试获取不到锁,线程可以不用一直等待就结束了;
5.synchronized的锁可重入、不可中断、非公平,而Lock锁可重入、可判断、可公平(两者皆可)
6.Lock锁适合大量同步的代码的同步问题,synchronized锁适合代码少量的同步问题。
然后由线程通讯----》从生产者消费者模式!!!
public class Productor {
public static void main(String[] args) {
Data da=new Data();
new Thread(()->{
for(int i=0;i<10;i++){
try{
da.decrement();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
new Thread(()->{
for(int i=0;i<10;i++){
try{
da.increment();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}
class Data{
private int num=0;
public synchronized void increment() throws InterruptedException {
//等待条件
if(num!=0){
this.wait();
}
num++;
System.out.println(Thread.currentThread().getName()+"="+num);
notifyAll();
}
public synchronized void decrement() throws InterruptedException {
//等待条件
if(num==0){
this.wait();
}
// 正常操作
num--;
System.out.println(Thread.currentThread().getName()+"="+num);
notifyAll();
}
}
**上面这个代码会产生虚假判断 :原因是if条件只判断一,所以我们可以用while代替if,来消除虚假唤醒!! **