同期のいくつかの特性を要約すると、欠点は指摘したいと考えています。
同期の基本的な特徴:
1、同期ロック再入力
説明:文字通り、再入可能です。このロックは2回獲得できます。つまり、スレッドがオブジェクトAのロックを取得すると、そのコードの実行中に(オブジェクトAのロックは解放されません)、デッドロックの問題が発生する代わりに、スレッドがオブジェクトAのロックを再度要求し、オブジェクトAのロックを再度取得できます。同期されたキーワードにはこの機能があり、再入可能なロックです。
コードは次のとおりです。
public class SynchronizedDemo {
public synchronized void method1(){
System.out.println("method1");
mothed2();
}
public synchronized void method2(){
System.out.println("method2");
}
public static void main(String...args){
final SynchronizedDemo synchronizedDemo = new SynchronizedDemo();
new Thread(new Runnable() {
@Override
public void run() {
synchronizedDemo.method1();
}
}).start();
}
}
出力結果:
method1;
method2;
出力から、作成されたスレッドがsynchronizedDemoオブジェクトのロックを2回取得したことがわかります。同期は再入可能ロックであることを確認します。
再入可能ロックを導入する意味は何ですか?
独自の内部ロックを取得できます。これにより、同じオブジェクトロックが2回呼び出されたときにデッドロックが回避されます。
実際の開発では、注文の変更と注文の確認(在庫確認など)を同期ロックで追加する必要があります。注文の変更を行う場合は、最初に注文の確認を行う必要があります(注文オブジェクトのロックを2回取得)。 。待って。
再入可能ロックの父親の息子の継承の他のプロパティ
コードは次のとおりです。
public class SynchronizedDome1 {
public synchronized void method1() {
System.out.println("method1");
}
static class SynchronizedDemo2 extends SynchronizedDome1{
public synchronized void method2() {
System.out.println("method2");
method1();
}
}
public static void main(String...args){
final SynchronizedDemo2 synchronizedDemo2 = new SynchronizedDemo2();
new Thread(new Runnable() {
@Override
public void run() {
synchronizedDemo2.method2();
}
}).start();
}
}
出力結果:
method2;
method1;
つまり、子オブジェクトのロックを取得した後で、親オブジェクトのロックに再び入ることができます。
2.例外が発生すると、ロックは自動的に解除されます。
コードは次のとおりです。
public class SynchronizedDome2 {
public int i = 10;
public String str;
public synchronized void method1() {
for(;i>0;i--){
System.out.println("i:"+i);
if(i==3){
str.toCharArray();
}
}
}
public static void main(String...args){
final SynchronizedDemo2 synchronizedDemo2 = new SynchronizedDemo2();
new Thread(new Runnable() {
@Override
public void run() {
synchronizedDemo2.method1();
}
}).start();
}
}
出力結果:
i:9
i:8
i:7
i:6
i:5
i:4
i:3
java.lang.NullPointerException
thread.SynchronizedDome2.method1(SynchronizedDome2.java:10)で
thread.SynchronizedDome2 $ 1.run(SynchronizedDome2.java:19)で
java.lang.Thread.run(Thread.java:745)で
例外が発生すると、プログラムは実行を継続せず、オブジェクトロックが解放されることを示します。
3.オブジェクトをリスナーとして使用します。
public class SynchronizedDome3 {
public String str = "lock";
public void method1() {
synchronized (str){
System.out.println("当前线程名:"+Thread.currentThread().getName());
}
}
public static void main(String...args){
final SynchronizedDemo3 synchronizedDemo3 = new SynchronizedDemo3();
new Thread(new Runnable() {
@Override
public void run() {
synchronizedDemo3.method1();
}
},"name1").start();
new Thread(new Runnable() {
@Override
public void run() {
synchronizedDemo3.method1();
}
},"name2").start();
}
}
当前线程名:name2
当前线程名:name1
或者
当前线程名:name1
当前线程名:name2
说明: 选取任意对象作为锁
4,单例模式---双重校验锁(懒汉式)
public class SingleCase {
private static SingleCase instance2;
public static SingleCase getInstance2(){
if(instance2 == null){
synchronized(SingleCase.lass){
if(instance2 == null){
instance2 = new SingleCase();
}
}
}
return instance2;
}
}