多线程

1. 多线程
多线程:一个程序(进程)运行性产生多个线程

并发:通过cpu的调度算法,客户感知是同时进行,但是从cpu的层面上来说不是同时进行的,并发场景往往存在共享资源,针对共享资源,往往会产生瓶颈,我们会用TPS和QPS反应系统的处理能力

多线程的生命周期:新建,就绪,运行,阻塞,消亡

synchronized
synchronized:锁定的是对象不是代码块
一个同步方法调用另一个同步方法,一个线程又有一个对象的对,再次申请的时候仍然会得到该对象的锁(synchronized的获取的锁是可以重入的)
但是多锁定对象的时候不要锁定字符串常量

线程的死锁:a和b两个线程 两把锁c和d,a锁锁定c的过程中要锁定d,b锁定d的过程中还要锁定c,这样形成交叉死锁。

在程序执行中,如果出现异常,默认的情况下锁会被释放,要对程序进行try {}catch{}

volatile
volatile:是指可见性,一个线程在更改了值之后对另一个线程是可见的,

volatile 轻量级别,synchronized 比较重 volatile是保证可见性synchronized既保持了原子性有保证了可见性 所以一般保证可见性的时候要用volatile

atomicInteger 是原子性的 , count++不是原子性的

wait 和noytify
wait和notify在使用的时候必须加锁,wait()不是释放锁,notify会释放锁 wait和notify是锁定对象的方法,notify是叫醒一个线程,notify是叫醒所有线程

countdownlatch(门栓)
countDownlatch是一个同步工具类,完成线程之间的通信
countDownlatch是一个线程等离岸另一个线程,另一个县城执行完毕之后才实现的
countDownlatch是通过计数器实现的,countDownlatch的的初始值是为现成的数量,每当一个线程执行完毕,初始值-1,当初始值为0表示处等待外的线程全部执行完毕,等待的线程将会执行,或者调用new countdownlatch.countDown()的方法,那么初始值会变成0,等待的线程会执行

new countdownlatch.await()门栓等待,new countdownlatch.countDown()门栓打开

CountDownLatch不足
计数器的初始值是一定的,不可以重新设置值,另外当CountDownlatch使用完毕之后不能再次使用

lock
synchronized由缺点
synchronized自动锁,两种情况下会释放锁,
1程序执行完毕
2程序抛出异常
lock属于手动上锁,手动释放锁,
lock里面有尝试锁定返回值未布尔类型可根据返回值做处理
lock.lock()或者lock.trylock(等待时长,等待时长单位)
lock.lockInterruptibly()//可被打断的线程,当线程调用thread1.interrupt()此案成被打断并且抛出异常InterruptedException

new ReentrantLock(ture)正定位公平锁,效率较慢,但是谁等呆的时间较长,说获取这把锁

new ReentrantLock.newCondition()可以更加精确地叫醒那些线程(可代替wait和notifyall)
这里写图片描述

ThreadLocal
threadLocal是线程局部变量,在某一线程内使用,不能线程共享

————————-时间问题周一在写————————-

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值