同期静的方法と同期非静的方法
3492 ワード
参考になるhttp://blog.sina.com.cn/s/blog_870 def 8202 vshl.
同期方法:1):同期静的方法:ある種類のObjectの中のある静的方法staticMethodに同期ロックをかけた後、あるスレッドThreadがstaticMethodを呼び出すと、Object類のロックを取得します.この時、他のスレッドは、Threadがロックを解除する前に、Objectクラスの任意の同期静的方法を呼び出すことができません.2):同期非静的方法:あるクラスのObjectの中のある非静的方法Methodに同期同期ロックが加えられた後、あるスレッドThreadがMethodを呼び出した時に対応するObjectオブジェクトのロックを取得します.他のスレッドはThreadリリース前に変更対象の任意の同期非静的方法を呼び出すことができません.3):両者の違い:前提:Objectには静的同期方法staticMethod 01、staticMethod 02、非静的同期方法Method 01、Method 02、スレッドThread 1とThread 2:Object obj 1=new Object()が含まれている.Object obj 2=new Object()*.a.Thread 1がObj 1.Method 01()を呼び出したい場合、Thread 2がObj 1.Method 01()を呼び出したい場合、またはObj 1.Method 01()は先にObj 1.Method 01()のリリースを待ってから呼び出します.b.Thread 1がobj 1.Method 01()を呼び出した場合、Thread 2は、Thread 01がロックを解除するのを待つことなく、obj 2.Method 01()またはobj 2.Method 02()を呼び出すことができる.*非静的同期法のロックはオブジェクトに対してあるためである.c.Thread 1がobj 1.static Method 01()を呼び出した場合、Thread 2はobj 1.static Me 01()を呼び出しても、obj 2.static Method 01()を呼び出しても、Thread 1がロックを解除するまで待つ必要があります.静的同期方法のロックはクラスに対してのものですから.
同期方法:1):同期静的方法:ある種類のObjectの中のある静的方法staticMethodに同期ロックをかけた後、あるスレッドThreadがstaticMethodを呼び出すと、Object類のロックを取得します.この時、他のスレッドは、Threadがロックを解除する前に、Objectクラスの任意の同期静的方法を呼び出すことができません.2):同期非静的方法:あるクラスのObjectの中のある非静的方法Methodに同期同期ロックが加えられた後、あるスレッドThreadがMethodを呼び出した時に対応するObjectオブジェクトのロックを取得します.他のスレッドはThreadリリース前に変更対象の任意の同期非静的方法を呼び出すことができません.3):両者の違い:前提:Objectには静的同期方法staticMethod 01、staticMethod 02、非静的同期方法Method 01、Method 02、スレッドThread 1とThread 2:Object obj 1=new Object()が含まれている.Object obj 2=new Object()*.a.Thread 1がObj 1.Method 01()を呼び出したい場合、Thread 2がObj 1.Method 01()を呼び出したい場合、またはObj 1.Method 01()は先にObj 1.Method 01()のリリースを待ってから呼び出します.b.Thread 1がobj 1.Method 01()を呼び出した場合、Thread 2は、Thread 01がロックを解除するのを待つことなく、obj 2.Method 01()またはobj 2.Method 02()を呼び出すことができる.*非静的同期法のロックはオブジェクトに対してあるためである.c.Thread 1がobj 1.static Method 01()を呼び出した場合、Thread 2はobj 1.static Me 01()を呼び出しても、obj 2.static Method 01()を呼び出しても、Thread 1がロックを解除するまで待つ必要があります.静的同期方法のロックはクラスに対してのものですから.
public class Count {
public static int count = 0;
//
public synchronized static void addCountS() {
count++;
}
//
public synchronized void addCount() {
count++;
}
@Override
public String toString() {
return "Count =" + count;
}
}
public class Test {
public static void main(String[] args) {
for (int i = 0; i < 1000; i++) {
new Thread(new Runnable() {
@Override
public void run() {
Count count = new Count();
// , 1000
// Count.addCountS();
// , , , , run new count , 。
count.addCount();
System.out.println(count);
}
}).start();
}
}
}