[面接準備]synchronized,static synchronized,再入社

7905 ワード

synchronized
synchronizedは、複数のスレッドが同時にアクセスできる臨界領域を監視ロック同期することができる.
監視ロックを使用してロックを持つオブジェクトを指定できます.同期メソッドまたは
同期ブロックによりrockを取得し、そのブロックを離れるとrockを解除する.
しかし、syncharnizedはrockを直接停止するため、パフォーマンスに影響を与える可能性があります.
synchronizedをメソッドに一時停止すると、このメソッドは一度に1つのスレッドしか実行されないため、同時処理はできません.リクエストに従ってスレッドを作成し、複数のリクエストを同時に処理する必要がある場合は、速度が遅くなります.他のクライアントリクエストは、現在のリクエストの完了を待つ必要があります.
したがって、同期ブロックのサイズを適切に保つ必要がある.
メソッドにsynchronizedを宣言するのと、特定のオブジェクトにsynchronizedを宣言するのとではどのような違いがありますか?
synchronizedメソッドはsynchronized(this){}ブロックと同様であり、現在のインスタンスのrockを得ることができる.
2つ以上のインスタンスがある場合、各インスタンスには監視ロックが必要であるため、2つのインスタンスはそれぞれの方法を実行できます.
このメソッドロックを取得すると、メソッドブロックを離れるとロックが返されます.
//둘 클래스는 같은 거임 
public class SynchronizedTest {

	public synchronized void a() {... }

	
	public synchronized void b() {... }

}

public class SynchronizedTest {

	public static void a() {
		synchronized(this) {... }
	}

	
	public static void b() {
		synchronized(this) {... }
	}

}
synchronizedがsynchronizedブロックを使用していることを特定のオブジェクトに宣言します.synchronizedメソッドでは、現在のオブジェクト自体がロックされますが、synchronizedブロックでは特定のオブジェクトのみがロックされ、最小限の必要な領域がロックされます.ロックブロックの範囲を縮小したので、同期性を向上させることができる.
static synchronized
synchrnoziedメソッドはインスタンスごとにロックを掛け、static synchronizedはクラス自体にロックを取得します.
クラスを使用する場合、一度に1つのスレッドしか使用できません.Static Synchronizedでロックをかけたオブジェクトは、クラスを最初にロードしたときに生成されたクラスタイプ情報を含むクラスクラスタイプのインスタンスです.
このクラスのインスタンスのrockが得られたと考えられる.
//둘 클래스는 같은 거임
public class StaticSynchronizedTest {

	public static synchronized void a() {... }

	
	public static synchronized void b() {... }

}

public class StaticSynchronizedTest {

	public static void a() {
		synchronized(StaticSynchronizedTest.class) {... }
	}

	
	public static void b() {
		synchronized(StaticSynchronizedTest.class) {... }
	}

}
ふくしんせい
synchronizedは再アクセスでき、特定のスレッドが自分が得た楽を再取得することができます.従来,スレッドが別のスレッドに楽を要求すると,そのスレッドは待機状態に入る.そのため、ある特定のスレッドがすでに獲得したロックを獲得しようとすると、待機状態に陥り、死に陥る.しかし、再び入ることで、同じ楽池に対して死を避けることができる.
JVMは誰がロックを獲得したのか、獲得回数はどのくらいなのかを記録している.同じスレッドがrockを再取得すると回数が増加し、所有するスレッドがsynchronizedブロックの外にある場合は回数が減少します.これで回数が0になると、この落下は解除されます.
public class Widget {
	public synchronized void doSomething() {
    	...
    }
}

public class LoggindWidget extends Widget {
	public synchronized void doSomething() {
    	System.out.println(toString() + ": calling doSomething");
        super.doSoemthing();
    }
}



Widget lw = new LoggindWidget();
lw.doSomething(); 
lwインスタンスにsynchronized rockを掛けると、widget、loggindwidgetの2つのクラスのインスタンスがrockを掛けたことを示します.
最初の線量測定では,1つの楽子が掛けられ,得られた同じ楽子が再び確保され,再進入が可能になった.