Сначала напишите один случай:
public Class Singleledemo {private static singleledemo s = null; private singleledemo () {} public static singleledemo getInstance () {if (s == null) {s = new singleledemo (); } return s; }}Напишите тестовый класс:
public class threaddemo3 {public static void main (string [] args) {singleledemo s1 = singleledemo.getinstance (); Singleledemo s2 = singleledemo.getinstance (); System.out.println (S2 == S2); }}Результат работы всегда верен, что означает, что в одном потоке нет проблем. Давайте напишем многопоточную для доступа к одному корпусу.
Общедоступный класс ThreadTest Refranse Runnable {// хранение объектов Singleton, использование Set - не хранить дублирующие элементы публичного набора <ingleledemo> singles = new Hashset <singleledemo> (); @Override public void run () {// получить singleledemo s = singleledemo.getinstance (); // Добавление Singleton Singles.add (s); }}Используйте многопоточный параллельный доступ к синглтонам:
public class threaddemo3 {public static void main (string [] args) {// singleledemo s1 = singleledemo.getinstance (); // singleledemo s2 = singleledemo.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]
Это означает, что существует резьбовая проблема безопасности доступа, и полученные экземпляры могут не совпадать
Как решить проблемы безопасности потока?
Конечно, используется механизм блокировки синхронизации.
Ниже приводится улучшение в Синглтоне:
Public Class SingleDemo {Private Static SingleDemo s = null; private singleledemo () {} public static synchronized singleledemo getInstance () {if (s == null) {s = new singleledemo ();} return s;}} Проблема безопасности потока была решена после добавления синхронной функции
Запустите несколько раз, чтобы получить один и тот же экземпляр, и не будет 2 экземпляров.
[com.persagy.thread.singledemo@12b6651]
Однако в случае многопоточного параллельного доступа каждый поток должен судить о замке каждый раз, когда он приобретает экземпляр, который является относительно низкой эффективностью. Чтобы повысить эффективность, я добавил метод двойного суждения, чтобы решить проблему эффективности
Код заключается в следующем:
public class singleledemo {private static singleledemo s = null; private singleledemo () {} public static singleledemo getInstance () {/ * Если первый поток получает объект экземпляра Singleton, * Когда последующий поток получает экземпляр, он не нуждается в вводе блока кода синхронизации. */if (s == null) {// Замок, используемый в блоке кода синхронизации, является объектом файла Bytecode в Singleton, и эта блокировка может использоваться только Synchronized (singleledemo.class) {if (s == null) {s = new singleledemo ();}} return s;}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}Этот метод решает проблему безопасности ленивых людей и повышает эффективность. Однако в реальном развитии все больше людей используют голодных людей. В конце концов, этот код более сложный и сложный.
Выше приведено полное содержание идеального решения проблемы безопасности ленивого потока в режиме дизайна в одном корпусе, который редактор приносит вам. Я надеюсь, что все будут поддерживать wulin.com больше ~