java同時プログラミング--Synchronizedの理解
2901 ワード
synchronizedはロックの基礎を実現します。Javaの各オブジェクトはロックとして使用できます。具体的には3つの形で表現されます。
(1)通常の同期方法で、ロックは現在のインスタンスオブジェクトです。
(2)静的同期方法、ロックは現在クラスのクラスのクラスのオブジェクトです。
(3)同期方法ブロック、ロックはSynchronized括弧に配置されているオブジェクトです。
まず普通の同期方法を見てください。
そして静的同期方法を見てください。上のコードを修正します。test()を静的に変更します。
最後に同期方法ブロックであり、カギは括弧内の設定オブジェクトに依存します。
合併を見ています。メモしてください。参考にしているThisです。 http://blog.csdn.net/xiao__gui/articale/detail/8188833
(1)通常の同期方法で、ロックは現在のインスタンスオブジェクトです。
(2)静的同期方法、ロックは現在クラスのクラスのクラスのオブジェクトです。
(3)同期方法ブロック、ロックはSynchronized括弧に配置されているオブジェクトです。
まず普通の同期方法を見てください。
class Sync{
public synchronized void test(String threadname){
System.out.println(threadname+" ");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(threadname+" ");
}
}
class MyThread extends Thread{
public int i;
public MyThread(int i){
this.i=i;
}
public void run(){
Sync sync=new Sync();
sync.test("Thread"+i);
}
}
public class SynTest {
public static void main(String args[]){
for(int i=0;i<3;i++){
Thread thread=new MyThread(i);
thread.start();
}
}
}
結果を実行しますThread2
Thread0
Thread1
Thread2
Thread0
Thread1
test()はsynchronizedのキーワードを入れましたが、機能しませんでした。これは、Trreadが3つ実例化され、synchronizedがロックされているのは、この3つの実用化対象であり、test()のコードではないからです。なお、他のスレッドは、スレッドがインスタンスオブジェクトをリリースした後にのみ、このインスタンスオブジェクトを使用することができる。そして静的同期方法を見てください。上のコードを修正します。test()を静的に変更します。
public static synchronized void test(String threadname)
実行結果Thread1
Thread1
Thread0
Thread0
Thread2
Thread2
今回はsynchronizedのキーワードが効きました。これは静的同期方法のロックが現在のクラスのクラスのクラスのオブジェクト、すなわちSyncクラスのクラスのオブジェクトであるからです。Thread 1が当該オブジェクトを取得してtest()を実行する場合、Thread 0はClassオブジェクトのリリースを待ってからのみ使用できます。 最後に同期方法ブロックであり、カギは括弧内の設定オブジェクトに依存します。
public void test(String threadname){
synchronized(this){
System.out.println(threadname+" ");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(threadname+" ");
}
}
使っているロックはthisです。私たちは各スレッドのためにSyncクラスを新たに作ったので、それらは三つの異なるthisです。結果は以下のとおりですThread0
Thread2
Thread1
Thread0
Thread1
Thread2
Synchronizedの役割はSyncc.lassオブジェクトをロックとして使うと分かります。同じ時刻にこのセグメントコードを実行するスレッドが一つしかありません。Thread0
Thread0
Thread1
Thread1
Thread2
Thread2
現在のクラスのクラスのオブジェクトをロックとして使うと、あるセグメントのコードにロックがかけられています。合併を見ています。メモしてください。参考にしているThisです。 http://blog.csdn.net/xiao__gui/articale/detail/8188833