Java同時synchronizedキーワード深さ解析(一)
3642 ワード
前言
最近、路神の絶世武学を研究し、広大な知識の海をぶらぶらしていた.このシリーズは、併発の実息子である片腕狂侠synchronizedの特別興行です.
一、シーンの使用
synchronizedはjavaのキーワードで、オブジェクトにロックをかけ、シングルマシンの同時条件下でスレッドの安全を保証します.原子性と可視性は、スレッドの安全を保証する基礎機能です.オブジェクトがロックされており、排他的な非公平な再ロックであることに注意してください.本稿では,まず使用するシーンからその役割を示す.
1、一般的な方法で使う
一般的なフォーマットは次のとおりです.
ここでobjは私たちがロックしたオブジェクトであり、同じオブジェクトであり、同じ瞬間に1つのスレッドでロックするしかない.すなわち、同じオブジェクトの複数の同期ブロックであり、順序で実行するしかなく、同時に並列に実行することはできない.
2、一般的な方法で使う
次のようになります.
通常の方法で使用する場合、ロックされたオブジェクトを指定する必要はありません.この場合、javaのデフォルトロックは現在のインスタンスオブジェクトです.効果は1に似ていて、括弧の中にはthisが入っています.
3、静的方法に用いる
次のようになります.
この場合、synchronizedは現在のクラスオブジェクトをロックし、グローバルロックが形成されます.つまり、同じJVMでこのメソッドを実行する場所は、このメソッドごとに実行されます.
二、synchronizedロックの昔のこと
皆さんはJUCバッグの中のlockロックについて知っているはずです.jdk 1です.5の時に現れた、出たばかりの時lockロックの性能はsynchronizedロックを全方位にローリングした.しかしsynchronizedはJavaの嫡系子孫として、JVMの開発者たちが全力を尽くして支えなければならないので、jdk 1では.6ではsynchronizedに対して多くの最適化を行い、lockロックとほぼ同じ性能を実現した.jdk 1で.6ではsynchronizedは異なる状況に分けてコードのロックメカニズムを最適化し、例えば3種類のロックに分けられる:偏向ロック、軽量級ロック、スピンロック、重量級ロック、ロック膨張戦略、ロッククリアメカニズムを設置し、ロット重偏向、偏向ロックロット取り消しなどの実現方式で同期ブロックの実行効率を高める.後で2節でその原理を紹介します.
三、後記
片腕狂侠とは何か、蓋因発功の時、片腕一刀(一度引用)だけで、左手に鍵をかける必要はなく、右手に鍵をかける必要はありません.
最近、路神の絶世武学を研究し、広大な知識の海をぶらぶらしていた.このシリーズは、併発の実息子である片腕狂侠synchronizedの特別興行です.
一、シーンの使用
synchronizedはjavaのキーワードで、オブジェクトにロックをかけ、シングルマシンの同時条件下でスレッドの安全を保証します.原子性と可視性は、スレッドの安全を保証する基礎機能です.オブジェクトがロックされており、排他的な非公平な再ロックであることに注意してください.本稿では,まず使用するシーンからその役割を示す.
1、一般的な方法で使う
一般的なフォーマットは次のとおりです.
1 public static void main(String[] args) {
2 Object obj = new Object();
3 synchronized (obj) {
4 System.out.println(" ");
5 //
6 System.out.println(" ");
7 }
8 }
ここでobjは私たちがロックしたオブジェクトであり、同じオブジェクトであり、同じ瞬間に1つのスレッドでロックするしかない.すなわち、同じオブジェクトの複数の同期ブロックであり、順序で実行するしかなく、同時に並列に実行することはできない.
2、一般的な方法で使う
次のようになります.
1 public synchronized void lockMethod () {
2 System.out.println(" ");
3 //
4 System.out.println(" ");
5 }
通常の方法で使用する場合、ロックされたオブジェクトを指定する必要はありません.この場合、javaのデフォルトロックは現在のインスタンスオブジェクトです.効果は1に似ていて、括弧の中にはthisが入っています.
3、静的方法に用いる
次のようになります.
1 public synchronized static void lockMethod () {
2 System.out.println(" ");
3 //
4 System.out.println(" ");
5 }
この場合、synchronizedは現在のクラスオブジェクトをロックし、グローバルロックが形成されます.つまり、同じJVMでこのメソッドを実行する場所は、このメソッドごとに実行されます.
二、synchronizedロックの昔のこと
皆さんはJUCバッグの中のlockロックについて知っているはずです.jdk 1です.5の時に現れた、出たばかりの時lockロックの性能はsynchronizedロックを全方位にローリングした.しかしsynchronizedはJavaの嫡系子孫として、JVMの開発者たちが全力を尽くして支えなければならないので、jdk 1では.6ではsynchronizedに対して多くの最適化を行い、lockロックとほぼ同じ性能を実現した.jdk 1で.6ではsynchronizedは異なる状況に分けてコードのロックメカニズムを最適化し、例えば3種類のロックに分けられる:偏向ロック、軽量級ロック、スピンロック、重量級ロック、ロック膨張戦略、ロッククリアメカニズムを設置し、ロット重偏向、偏向ロックロット取り消しなどの実現方式で同期ブロックの実行効率を高める.後で2節でその原理を紹介します.
三、後記
片腕狂侠とは何か、蓋因発功の時、片腕一刀(一度引用)だけで、左手に鍵をかける必要はなく、右手に鍵をかける必要はありません.