먼저 단일 사례를 작성하십시오.
공개 클래스 Singledemo {private static singledemo s = null; private singledemo () {} public static singledemo getinstance () {if (s == null) {s = new Singledemo (); } 반환 s; }}테스트 클래스 작성 :
public class strook threaddemo3 {public static void main (String [] args) {Singledemo S1 = SingledEmo.getInstance (); Singledemo S2 = SingledEmo.getInstance (); System.out.println (S2 == S2); }}실행 결과는 항상 사실이므로 단일 스레드에서는 아무런 문제가 없습니다. 단일 케이스에 액세스하기 위해 멀티 스레드를 작성해 봅시다.
공개 클래스 스레드 테스트는 실행 가능 {// 싱글 톤 객체 저장, 세트를 사용하여 중복 요소를 저장하지 않아야합니다. @override public void run () {// get singledemo s = singledemo.getinstance (); // 싱글 톤 싱글을 추가합니다 .add (s); }}싱글 톤에 대한 멀티 스레드 동시 액세스 사용 :
public class threaddemo3 {public static void main (string [] args) {// singledemo s1 = singledemo.getinstance (); // Singledemo S2 = SingledEmo.getInstance (); // System.out.println (S2 == S2); ThreadTest t = new ThreadTest (); 새 스레드 (t) .start (); 새 스레드 (t) .start (); 새 스레드 (t) .start (); 새 스레드 (t) .start (); 새 스레드 (t) .start (); 새 스레드 (t) .start (); 새 스레드 (t) .start (); 새 스레드 (t) .start (); 새 스레드 (t) .start (); System.out.println (T.Singles); }}
작업 결과는 다음과 같습니다.
[com.persagy.thread.singledemo@1bc4459, com.persagy.thread.singledemo@150bd4d]
또는
[com.persagy.thread.singledemo@12b6651]
그것은 나사로 동시 액세스 보안 문제가 있고 획득 된 인스턴스가 동일하지 않을 수 있음을 의미합니다.
스레드 안전 문제를 해결하는 방법?
물론 동기화 잠금 메커니즘이 사용됩니다.
다음은 싱글 톤의 개선입니다.
공개 클래스 SingledEmo {private static singledemo s = null; private singledemo () {} public static synchronized singledemo getinstance () {if (s == null) {s = new SingledEmo ();} return s;}} 동기 기능을 추가 한 후 스레드 안전 문제가 해결되었습니다.
동일한 인스턴스를 얻으려면 여러 번 실행하면 2 개의 인스턴스가 없습니다.
[com.persagy.thread.singledemo@12b6651]
그러나 멀티 스레드 동시 액세스의 경우 각 스레드는 인스턴스를 획득 할 때마다 잠금을 판단해야하며, 이는 비교적 낮은 효율입니다. 효율성을 향상시키기 위해 효율성 문제를 해결하기 위해 이중 판단 방법을 추가했습니다.
코드는 다음과 같습니다.
공개 클래스 SingledEmo {private static singledemo s = null; private singledemo () {} public static singledemo getinstance () {/ * 첫 번째 스레드가 싱글 톤의 인스턴스 개체를 얻는 경우, 후속 스레드가 인스턴스를 얻을 때 동기화 코드 블록을 입력 할 필요가 없습니다. */if (s == null) {// 동기화 코드 블록에 사용 된 잠금은 싱글 톤의 바이트 코드 파일 객체 이며이 잠금은 동기화 (SingledEmo.class) {if (s == null) {s = new SundleDemo ();}}} return s;이 방법은 게으른 사람들의 실 안전 문제를 해결하고 효율성을 향상시킵니다. 그러나 실제 발전에서 더 많은 사람들이 배고픈 사람들을 사용합니다. 결국,이 코드는 더 복잡하고 복잡합니다.
위의 것은 편집자가 당신에게 가져 오는 단일 케이스 설계 모드에서 게으른 스레드 안전 문제에 대한 완벽한 솔루션의 완전한 내용입니다. 모두가 wulin.com을 더 지원하기를 바랍니다