powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как достигется потокобезопастность?
20 сообщений из 20, страница 1 из 1
Как достигется потокобезопастность?
    #38796997
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как тут достигается потокобезопастность при получении Point?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public class Point{
	
	private static class PointHolder {
		static Point instace = new Point();
	}
	
	public static PointgetInstance() {
		return PointHolder.instace;
	}
	
}
...
Рейтинг: 0 / 0
Как достигется потокобезопастность?
    #38797001
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
public static Point getInstance()
...
Рейтинг: 0 / 0
Как достигется потокобезопастность?
    #38797005
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174,

JVM даёт гарантии на потокобезопасность при загрузке и инициализации классов. Внутренний PointHolder позволяет реализовать отложеную инициализацию. final, кстати, потерялся.
...
Рейтинг: 0 / 0
Как достигется потокобезопастность?
    #38797018
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,
как-то непонятно, а что произошло бы без отложенной инициализации? например так

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
public class Point {
	
	static Point instace = new Point();
	
	public static Point getInstance() {
		return instace;
	}
	
}
...
Рейтинг: 0 / 0
Как достигется потокобезопастность?
    #38797023
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174,

Опять забываешь final.

Без отложенной инициализации экземпляр бы создался всегда, даже если приложению он не нужен.
Отложенная позволяет создать только по требованию.
...
Рейтинг: 0 / 0
Как достигется потокобезопастность?
    #38797025
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174как-то непонятно, а что произошло бы без отложенной инициализации? например так

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
public class Point {
	
	static Point instace = new Point();
	
	public static Point getInstance() {
		return instace;
	}
	
}


В этом случае синглтон инициализируется при любом первом упоминании класса Point.
А при сипользовании PointHolder синглтон инициализируется только при обращенни к PointHolder, который нужен только для того чтобы получить instance. Т.е. инициализация происходит при первом обращении к экземпляру синглтона.
...
Рейтинг: 0 / 0
Как достигется потокобезопастность?
    #38797086
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz , Сергей Арсеньев ,
Что-то у меня ощущение, что и без final все будет работать корректно.
...
Рейтинг: 0 / 0
Как достигется потокобезопастность?
    #38797106
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
извините, конечно за такие вопросы... )

давайте сначала забудем про многопоточность и разберемся зачем там нужен final для instance?
instance - это статик поле, разве оно будет инициализироваться более одного раза для класса?
вы говорите, что
Blazkowiczсинглтон инициализируется при любом первом упоминании класса PointСергей АрсеньевБез отложенной инициализации экземпляр бы создался всегда, даже если приложению он не нужен.

как я понял из ваших слов, каждый раз при упоминании класса поинт будет создаваться экземпляр?

след-ее это не подверждает:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public class Stage {

	private int counter;
	
	public Stage() {
		counter++;
		System.out.println(this.toString());
	}
	
	@Override
	public String toString() {
		return "Stage [counter=" + counter + "]";
	}
	
	private static Stage instance = new Stage();
	
	public static Stage getInstance() {
		return instance;
	}
	
}




Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
		Stage[] stages = new Stage[10];
		for(int i=0; i < 10; i++) {
			stages[i] = Stage.getInstance();
		}
		
		for(int i=1; i < 10; i++) {
			if(stages[0] != stages[i]) {
				System.out.println("false");
			}
		}



получим авторStage [counter=1]
сингльтон же?
...
Рейтинг: 0 / 0
Как достигется потокобезопастность?
    #38797135
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoach Blazkowicz , Сергей Арсеньев ,
Что-то у меня ощущение, что и без final все будет работать корректно.
Гы. Я даже знаю ситуации когда с final будет работать некорректно.
Но при статическом анализе в IDE будет проще понять, почему instace нельзя менять. :)
...
Рейтинг: 0 / 0
Как достигется потокобезопастность?
    #38797143
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевЯ даже знаю ситуации когда с final будет работать некорректно.
Правда в этом случае и static наверное уже достаточно.
...
Рейтинг: 0 / 0
Как достигется потокобезопастность?
    #38797161
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoach Blazkowicz , Сергей Арсеньев ,
Что-то у меня ощущение, что и без final все будет работать корректно.
Это не важно. Можно исходить из той предпосылки final сразу даёт понять что это immutable ссылка. А если оно не final, то при чтении кода, задешь себе вопросы - "а почему"? "а потому что есть сценарии его поменять или автор просто леняй. А возможно экономит драгоценные байты исходного кода?"
...
Рейтинг: 0 / 0
Как достигется потокобезопастность?
    #38797166
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174а забудем про многопоточность и разберемся зачем там нужен final для instance?
Не будем ни о чем забывать.
- Потому что final сразу показывает при чтении что это единственный экземпляр и его нельзя поменять. То есть ключевое слово тупо здесь уменьшается единственную надежную метрику качества кода - WTF per minute.
- Потому что final в JMM даёт дополнительные гарантии и при чтении значение из поля.
...
Рейтинг: 0 / 0
Как достигется потокобезопастность?
    #38797173
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174как я понял из ваших слов, каждый раз при упоминании класса поинт будет создаваться экземпляр?

Можно цитату где я писал про "каждый"?
Разница в отложенности, вот в таком коде
Код: java
1.
System.out.println(Point.class.getName()); 


Нам экземпляр синглтона здесь нафиг не нужен. Но без внутреннего Holder-а он будет создани при инициализации класса Point.
...
Рейтинг: 0 / 0
Как достигется потокобезопастность?
    #38797211
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczrema174а забудем про многопоточность и разберемся зачем там нужен final для instance?- Потому что final сразу показывает при чтении что это единственный экземпляр и его нельзя поменять.
ну чтож, логично. по сути, получаемый инстанс - финал.

Blazkowicz
Код: java
1.
System.out.println(Point.class.getName());


Нам экземпляр синглтона здесь нафиг не нужен. Но без внутреннего Holder-а он будет создани при инициализации класса Point.
вы уверены, что "без внутреннего Holder-а он будет создан при инициализации класса"?
т.к. выполнение этой строки не приводит к созданию объекта (экземпляра) синглтона, т.к. конструктор не срабатывает в классе показанном тут 16805165
...
Рейтинг: 0 / 0
Как достигется потокобезопастность?
    #38797227
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174,

Point.class - плохой пример. Похоже, что ссылка на метаданные класса не инициализирует класс. Нужно другое применение класса.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
public class Test {
    static class NoHolder{
        static final NoHolder instance = new NoHolder();
        NoHolder() {
            System.out.println("NoHolder instance initialized");
        }
        public static void use() {}
    }

    static class Lazy {
        static class Holder {
            static final Lazy instance = new Lazy();
        }

        Lazy() {
            System.out.println("Holder instance lazily initialized");
        }
        public static void use() {}
    }

    public static void main(String[] args) {
        Lazy.use();
        NoHolder.use();
    }
}
...
Рейтинг: 0 / 0
Как достигется потокобезопастность?
    #38797236
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

JLS12.4.1. When Initialization Occurs

A class or interface type T will be initialized immediately before the first occurrence of any one of the following:

T is a class and an instance of T is created.

T is a class and a static method declared by T is invoked.

A static field declared by T is assigned.

A static field declared by T is used and the field is not a constant variable (§4.12.4).

T is a top level class (§7.6), and an assert statement (§14.10) lexically nested within T (§8.1.3) is executed.
...
Рейтинг: 0 / 0
Как достигется потокобезопастность?
    #38797249
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174,

Вам про Фому, Вы про Ерёму:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
public class Point {
	
	static Point instace = new Point("Single");
	
	public static Point getInstance() {
		return instace;
	}

        public Point(String a) {
          System.out.println("Сделан:"+a);
        } 

}

public class PointH{
	
	private static class PointHolder {
		static PointH instace = new PointH("Single H");
	}
	
	public static PointH getInstance() {
		return PointHolder.instace;
	}
	

	public PointH(String a) {
          System.out.println("Сделан H:"+a);
	}

}

public class Test {

  public static void main(String[] args) {
   Point p = new Point("Не сингл!");
   PointH pH = new PointH("Не сингл!");
  }

}
...
Рейтинг: 0 / 0
Как достигется потокобезопастность?
    #38797259
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ок, с отложенной инициализацией разобрались

как теперь связать это
BlazkowiczJVM даёт гарантии на потокобезопасность при загрузке и инициализации классови отложенную инициализацию?

какая связь между потокобезопастностью и отложенной ин-й не вьеду...
...
Рейтинг: 0 / 0
Как достигется потокобезопастность?
    #38797262
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174как теперь связать это
BlazkowiczJVM даёт гарантии на потокобезопасность при загрузке и инициализации классови отложенную инициализацию?

какая связь между потокобезопастностью и отложенной ин-й не вьеду...
Никак. Если отложеная инициализация не нужна, то и Holder не нужен.
...
Рейтинг: 0 / 0
Как достигется потокобезопастность?
    #38797264
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Вернее как. Они связаны тем что оба относятся к классической проблеме релизации потокобезопасного синглтона с отложеной инициализацией в Java.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Как достигется потокобезопастность?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]