マルチスレッド安全性の問題
複数のスレッドが共通の目標にアクセスすると、一貫性のないデータが得られ!エフェクトのアイコン:
その理由の概要:
-
-
重要なリソース:共有リソース(同じオブジェクト)、使用に一つだけのスレッドを許可し、利用できる保証はその精度。
-
(お金<バランス)とバランス場合、認証コードので - =お金は全体(アトミック操作)の両方で、マルチスレッドアトミック操作は、安全性の問題には、このリードを破壊します!
ソリューション
シンクブロック
同期(クリティカル・リソース・オブジェクト){ // クリティカル・リソース・オブジェクトのロック // コード(原子) } 注:「各オブジェクトがスレッドに割り当てられていることをミューテックスタグを有している。」 「のみ所有者オプジェクト排他ロックマークスレッド同期コードは、ターゲットのロックされたブロックを入力します。「 」スレッドが同期ブロックを終了し、ミューテックス対応するマークを解放します。」
同期方法
synchronized 返回值类型 方法名称(形参列表){ //对当前对象(this)加锁 //代码(原子操作) } 注: "只有拥有对象互斥锁标记的线程,才能进入对该对象加锁的同步代码块。" "线程退出同步代码块时,会释放相应的互斥锁标记。"
死锁
-
当第一个线程拥有A对象锁标记,并等待B对象锁标记,同时第二个线程拥有B对象锁标记,并等待A对象锁标记时,产生死锁。
-
演示案例: 一绑匪绑了张三的女友,给张三打电话要求张三先交钱,再放其女友;张三说只有先放人再给钱。用程序模拟:
创建执行绑匪任务的线程,手握两把锁
创建执行男友任务的线程,也是手握俩两把锁,顺序相反!
双方互相持有对方所需的锁标记而不相让,这样僵持的状态称之为死锁
通过死锁和生产者消费者两个问题发现,在引入了锁机制后带来了一些问题,因此设想如果线程之间能通信该多好啊!
线程通讯
要解决以上的问题,必须要在线程间通信。
notify All()通知唤醒因obj对象而无限等待的线程