多线程知识点总结

多线程的问题主要围绕3个问题处理:1.原子性,2.可见性,3.有序性

1.原子性,不可被其他线程打断的操作。如read.write

sychronized

2.可见性:一条线程修改了某值,新值对其他线程立即可知;

普通变量是通过主内存完成多线程的共享,因此在多线程的情况下,很多脏数据。

volatile,sychronized,final

3.有序性:保证多线程的操作顺序同代码执行顺序一致。

如1)i=0,2)j=i,3)i=20.A线程执行1后,才能执行2,然后C执行3,若C指令使3提前执行,则最后结果为i=10,j=10

sychornized,volatile


线程调度

协同调度,运行结束后,主动通知系统切换到另一个线程上。

缺点:如果不告知,会形成阻塞。

抢占式调度:线程由系统分配时间,线程切换不由线程决定。


线程五个状态:新建、运行、等待、阻塞、结束。


线程安全

当多个线程访问一个对象时,总能获得正确的调用结果。


悲观锁和乐观锁

悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,

乐观锁:拿数据的时候都认为别人不会修改,所以不会上锁。如CAS

线程安全实现方法

1.互斥同步

为悲观锁,且阻塞同步。

方法有:临界区,互斥量,信号量。

同步手段:1.sychronized;2.reentraintLock

1.非阻塞同步

为乐观锁。CAS实现。

锁的四种状态:无锁,偏向锁,轻量级锁,重量级锁。

锁优化:

自旋锁,锁消除,锁粗化,轻量级锁,偏向锁。

1.自旋锁:线程发现没有取得锁时,为防止线程频繁切换状态,可以并行两个或者两个以上的线程,使后面的线程等待释放锁(需要让其执行一个循环,即自旋)

2.锁消除:对代码上要求同步,实际上被检测到不可能存在共享数据竞争的锁进行消除。

3.锁粗化:原则上使同步块作用范围尽量小——只在共享数据的实际作用域中才进行同步。但如果没有线程竞争,也频繁进行互斥同步等操作,会导致不必要的性能消耗。此时要把加锁同步范围扩展,即粗化到整个系列外部。

4.轻量级锁:无竞争的情况下使用CAS操作消除同步使用的互斥量

场景:线程交替执行同步块的情况,若同时访问同一锁,会膨胀为重量级锁。 

5.偏向锁:把整个同步消掉,进出也没有CAS。锁会偏向于第一个获得它的线程,记录第一次获得锁的线程ID,之后该ID的线程再次进入 这个锁的相关同步块时,虚拟机不再做任何操作,如lock,unlock.当有其他线程尝试获取该锁时,偏向模式结束。


如1)i=0,2)j=i,3)i=20.A线程执行1后,才能执行2,然后C执行3,若C指令使3提前执行,则最后结果为i=10,j=10

sychornized,volatile


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值