多线程
Posted lvsheng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程相关的知识,希望对你有一定的参考价值。
多线程
了解线程和进程的区别
进程:一个程序,QQ.exe Music.exe 程序的集合;
并发、并行
并发编程:并发、并行
并发(多线程操作同一个资源)
CPU 一核 ,模拟出来多条线程,天下武功,唯快不破,快速交替
并行(多个人一起行走)
CPU 多核 ,多个线程可以同时执行; 线程
多个线程操作同个资源
Synchronized(Java内置关键字)和Lock(接口)
1、Synchronized 内置的Java关键字, Lock 是一个Java类
2、Synchronized 无法判断获取锁的状态,Lock 可以判断是否获取到了锁
3、Synchronized 会自动释放锁,lock 必须要手动释放锁!如果不释放锁,死锁
4、Synchronized 线程 1(获得锁,阻塞)、线程2(等待,傻傻的等);Lock锁就不一定会等待下 去;
5、Synchronized 可重入锁,不可以中断的,非公平;Lock ,可重入锁,可以 判断锁,非公平(可以 自己设置);
6、Synchronized 适合锁少量的代码同步问题,Lock 适合锁大量的同步代码
这里主要讲Lock接口
实现类ReentrantLock无参构造默认是非公平锁 传入true既是公平锁,
public static void main(String[] args) {
// System.out.println(Runtime.getRuntime().availableProcessors());
Tic tic=new Tic();
new Thread(()->{ for (int i = 0; i <50 ; i++) tic.sale();},"A").start();
new Thread(()->{ for (int i = 0; i <50 ; i++) tic.sale();},"B").start();
new Thread(()->{ for (int i = 0; i <50 ; i++) tic.sale();},"C").start();
}
}
class Tic1{
int num=50;
public void sale(){
java.util.concurrent.locks.Lock lock=new ReentrantLock();
lock.lock(); //加锁
try {
if(num>0){
System.out.println(Thread.currentThread().getName()+"卖出"+(num--)+"票 剩余"+num);
}
}catch (Exception e){
}finally {
lock.unlock(); //解锁
}
?
}
Condition 精准的通知和唤醒线程
public class PcTo {
public static void main(String[] args) {
// System.out.println(Runtime.getRuntime().availableProcessors());
Tic3 tic=new Tic3();
new Thread(()->{ for (int i = 0; i <10 ; i++) {
try {
tic.add();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"A").start();
new Thread(()->{ for (int i = 0; i <10 ; i++) {
try {
tic.remove();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"B").start();
?
new Thread(()->{ for (int i = 0; i <10 ; i++) {
try {
tic.remove2();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"C").start();
?
?
}
}
?
class Tic3{
Lock lock=new ReentrantLock();
Condition condition1=lock.newCondition();
Condition condition2=lock.newCondition();
Condition condition3=lock.newCondition();
int num=0;
public void add() throws InterruptedException {
lock.lock(); //上锁
try {
while(num!=0){ //当num不等于0 通知其他线程
condition1.await(); //等待
}
System.out.println(Thread.currentThread().getName()+":aaaa"+num);
num=1;
condition2.signal();
}catch (Exception e){
?
}finally {
lock.unlock();
}
?
}
?
public void remove() throws InterruptedException {
lock.lock(); //上锁
try {
while(num!=1){ //当num不等于0 通知其他线程
condition2.await(); //等待
}
System.out.println(Thread.currentThread().getName()+":bbbbbbbbb"+num);
num=