019_マルチスレッドの同期

マルチスレッド安全性の問題

複数のスレッドが共通の目標にアクセスすると、一貫性のないデータが得られ!エフェクトのアイコン:

最初の配列にスレッド「こんにちは」スペース;配列の最初の空間にBのスレッド「の世界は、」一貫性のないデータにつながる、カバレッジ値が発生します。

その理由の概要:

  1. 重要なリソースへのマルチスレッドの同時アクセスは、アトミック操作の破壊は、一貫性のないデータにつながる可能性がある場合とき。

  2. 重要なリソース:共有リソース(同じオブジェクト)、使用に一つだけのスレッドを許可し、利用できる保証はその精度。

  3. アトミック操作:整数倍のステップは、全体としてみなされる、と秩序が乱れたり、デフォルトのステップすることはできません。

シーン安全デモ

アプリケーションに延期、それは例えば、セキュリティ上の問題を生成する方法である:A夫婦の相互運用可能な同じアカウント、操作を実行するためのお金を引き出します。

 

(お金<バランス)とバランス場合、認証コードので - =お金は全体(アトミック操作)の両方で、マルチスレッドアトミック操作は、安全性の問題には、このリードを破壊します! 

 

ソリューション

シンクブロック

同期(クリティカル・リソース・オブジェクト){ // クリティカル・リソース・オブジェクトのロック
     // コード(原子)
} 
注:「各オブジェクトがスレッドに割り当てられていることをミューテックスタグを有している。」 
    「のみ所有者オプジェクト排他ロックマークスレッド同期コードは、ターゲットのロックされたブロックを入力します。「
    」スレッドが同期ブロックを終了し、ミューテックス対応するマークを解放します。」

同期方法

synchronized 返回值类型 方法名称(形参列表){ //对当前对象(this)加锁
     //代码(原子操作)
}
注:
   "只有拥有对象互斥锁标记的线程,才能进入对该对象加锁的同步代码块。"
    "线程退出同步代码块时,会释放相应的互斥锁标记。"

死锁

死锁:

  • 当第一个线程拥有A对象锁标记,并等待B对象锁标记,同时第二个线程拥有B对象锁标记,并等待A对象锁标记时,产生死锁。

  • 一个线程可以同时拥有多个对象的锁标记,当线程阻塞时,不会释放已拥有的锁标记,由此可能造成死锁。

演示案例: 一绑匪绑了张三的女友,给张三打电话要求张三先交钱,再放其女友;张三说只有先放人再给钱。用程序模拟:

 

创建执行绑匪任务的线程,手握两把锁

创建执行男友任务的线程,也是手握俩两把锁,顺序相反!

双方互相持有对方所需的锁标记而不相让,这样僵持的状态称之为死锁

生产者和消费者问题:

  • 若干个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了能使生产者和消费者能并发执行,在两者之间设置一个能存储多个产品的缓冲区,生产者将生产的产品放入缓冲区,消费者从缓冲区中取走产品去消费,显然生产者和消费者必须同步,即不允许消费者去一个空的缓冲区取产品,也不允许生产者到一个满的缓冲区放入产品。

通过死锁和生产者消费者两个问题发现,在引入了锁机制后带来了一些问题,因此设想如果线程之间能通信该多好啊!

线程通讯

要解决以上的问题,必须要在线程间通信。

再通过代码演示(用两个线程,用wait和notify方法,体现等待和通知的思想即可)

再在此案例的基础上,构建多个线程,使用notify All再演示一下

wait() 主动释放锁,进入无限期等待

notify All()通知唤醒因obj对象而无限等待的线程

 

完善整个线程状态图

おすすめ

転載: www.cnblogs.com/a276665092/p/12050956.html