并发编程(02)---- 认识*锁和基本信息
1、活跃性问题
死锁
饥饿
活锁
2、时间片:
多线程的时候,cpu会给每个线程一个时间片,但是时间片很短,可能线程还没执行完时间就过期了,的让出cpu给其他线程使用,为了保持这个线程下次还没继续完成任务,还的保存线程的运行数据,也是很消耗性能的
3、饥饿与公平
高优化级的吞噬所有低优先级的CPU时间片
线程被永久堵塞在一个等待进入同步块的状态
等待的线程永远不被唤醒
如何避免饥饿问题
t1.setPriority(10); 设置线程优先级,win最小为1,大为10
设置合理的优先级
使用锁来代替synchronize
当几个线程同时对一个变量进行操作时,A线程执行了加,但是还没有赋值,时间片被B线程抢了过去,又对这个变量进行加,结果A线程和B线程的计算得到的值是一样的
4、线程安全性问题
多线程环境下
多个线程共享一个资源
对资源进行非原子性操作
5、Synchronize的原理和使用
内置锁
互斥锁
修饰普通方法
修饰静态方法
6、任何对象都可以作为锁,那么锁信息又存在什么地方呢?
(1)存在对象头中
(2)对象头中的信息
Mark Word (锁关注的地方)
Class Metadata Address
Array Length
7、偏向锁(获取锁资源不释放,当别的线程来尝试访问的时候才会释放锁)
每次获取锁和释放锁会浪费资源
很多情况下,竞争锁不是由多个线程,而是由一个线程在使用
只有一个线程在访问同步代码块的场景
在偏向锁状态时
线程ID
Epoch
对象的分代年龄信息
是否是偏向锁
锁标志位
8、轻量级锁
自旋
多线程可以同时
重量级锁