Hello friend, I'm |

Ritchie里其

园龄:2年6个月粉丝:4关注:7

2023-02-19 00:20阅读: 20评论: 0推荐: 0

多线程2

1、在我们实际使⽤中,线程池的⼤⼩配置多少合适?

对于计算密集型,设置 线程数 = CPU数 + 1;

对于I/O密集型,线程数 = CPU数 * CPU利⽤率 * (任务等待时间 / (任务计算时间 + 1)) 。

2、死锁的四个必要条件:

  1. 互斥
  2. 请求和保持
  3. 不可剥夺
  4. 环路等待

3、终止线程的方法:shutdown

4、让核心线程实现一直存活的方法:take

volatile能保证可见性,不能保证原子性,保证有序性(指令重排)

5、Volatile和Synchronized区别?

volatile只能修饰实例变量和类变量,⽽synchronized可以修饰⽅法,以及代码块。

volatile保证数据的可⻅性(当有的线程修改了Volatile修饰的变量值并写回到主内存后,其他线程能⽴即看到最新的值)。但是不保证原⼦性(多线程进⾏写操作,不保证线程安全)。
⽽synchronized是⼀种排他(互斥)的机制。 volatile⽤于禁⽌指令重排序:可以解决单例双重检查对象初始化代码执⾏乱序问题。
volatile可以看做是轻量版的synchronized,volatile不保证原⼦性,但是如果是对⼀个共享变量进⾏多个线程的赋值,⽽没有其他的操作,那么就可以⽤volatile来代替synchronized,因为赋值本⾝是有原⼦性的,⽽volatile⼜保证了可⻅性,所以就可以保证线程安全了。

volatile可以通过加锁来保证原子性。

6、指令重排

是指编译器或CPU为了优化程序的执行性能而对指令进行重新排序的一种手段,但重排序会带来可见性问题,所以在多线程开发中必须要关注并规避重排序。

编译器和cpu处理器都遵守”as-if-serial语义“,保证单线程

7、as-if-serial

表示所有的程序指令都可以因为优化而被重排序,但是在优化的过程中必须要保证是在单线程环境下,重排序之后的运行结果和程序代码本身预期的执行结果一致,Java编译器、CPU指令重排序都需要保证在单线程环境下的as-if-serial语义是正确的。

不存在数据依赖的操作,可能会被编译器和cpu指令重排,Volatile通过设置内存屏障来防止指令重排,内存屏障是一个CPU的指令,它可以保证特定操作的执行顺序。从而避免多线程环境下程序乱序执行的现象。

8、内存屏障分为四种:

  • StoreStore屏障
  • StoreLoad屏障
  • LoadLoad屏障
  • LoadStore屏障

本文作者:Ritchie里其

本文链接:https://www.cnblogs.com/wang-zeyu/p/17134073.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Ritchie里其  阅读(20)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
✨欢迎你~🍻
✨欢迎你~🍻
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 遥か Aimer
遥か - Aimer
00:00 / 00:00
An audio error has occurred.

作词 : aimerrhythm/田中ユウスケ

作曲 : 田中ユウスケ

编曲 : 玉井健二/百田留衣

海岸線の雨に ちらばった君の影

思い出が交差する 海辺の街

君はあの日のまま いまも夢を見てた

君はあの日のまま いまも夢を見てた

遥か記憶の空 2人照らす光

遥か記憶の空 2人照らす光

膝までの浅瀬で 見つけた星

君まで届くなんてさ ありえないような

浅い眠りの中で 深い夢から覚めて

浅い眠りの中で 深い夢から覚めて

裸足のまま駆けてく まばゆい星

君はあの日のまま どんな夢を見てた?

君はあの日のまま どんな夢を見てた?

遥か記憶の空 2人照らす光

遥か記憶の空 2人照らす光

いつまでもこうして 笑っててほしい

夜空に舞い上がる 幾千の花びら

でたらめな誓いで 生きてく日々

君から届くなんてさ ありえないような