Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Как достигется потокобезопастность? / 20 сообщений из 20, страница 1 из 1
06.11.2014, 10:06
    #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
06.11.2014, 10:08
    #38797001
rema174
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как достигется потокобезопастность?
public static Point getInstance()
...
Рейтинг: 0 / 0
06.11.2014, 10:10
    #38797005
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как достигется потокобезопастность?
rema174,

JVM даёт гарантии на потокобезопасность при загрузке и инициализации классов. Внутренний PointHolder позволяет реализовать отложеную инициализацию. final, кстати, потерялся.
...
Рейтинг: 0 / 0
06.11.2014, 10:20
    #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
06.11.2014, 10:26
    #38797023
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как достигется потокобезопастность?
rema174,

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

Без отложенной инициализации экземпляр бы создался всегда, даже если приложению он не нужен.
Отложенная позволяет создать только по требованию.
...
Рейтинг: 0 / 0
06.11.2014, 10:29
    #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
06.11.2014, 11:34
    #38797086
DEVcoach
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как достигется потокобезопастность?
Blazkowicz , Сергей Арсеньев ,
Что-то у меня ощущение, что и без final все будет работать корректно.
...
Рейтинг: 0 / 0
06.11.2014, 11:49
    #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
06.11.2014, 12:06
    #38797135
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как достигется потокобезопастность?
DEVcoach Blazkowicz , Сергей Арсеньев ,
Что-то у меня ощущение, что и без final все будет работать корректно.
Гы. Я даже знаю ситуации когда с final будет работать некорректно.
Но при статическом анализе в IDE будет проще понять, почему instace нельзя менять. :)
...
Рейтинг: 0 / 0
06.11.2014, 12:10
    #38797143
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как достигется потокобезопастность?
Сергей АрсеньевЯ даже знаю ситуации когда с final будет работать некорректно.
Правда в этом случае и static наверное уже достаточно.
...
Рейтинг: 0 / 0
06.11.2014, 12:21
    #38797161
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как достигется потокобезопастность?
DEVcoach Blazkowicz , Сергей Арсеньев ,
Что-то у меня ощущение, что и без final все будет работать корректно.
Это не важно. Можно исходить из той предпосылки final сразу даёт понять что это immutable ссылка. А если оно не final, то при чтении кода, задешь себе вопросы - "а почему"? "а потому что есть сценарии его поменять или автор просто леняй. А возможно экономит драгоценные байты исходного кода?"
...
Рейтинг: 0 / 0
06.11.2014, 12:23
    #38797166
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как достигется потокобезопастность?
rema174а забудем про многопоточность и разберемся зачем там нужен final для instance?
Не будем ни о чем забывать.
- Потому что final сразу показывает при чтении что это единственный экземпляр и его нельзя поменять. То есть ключевое слово тупо здесь уменьшается единственную надежную метрику качества кода - WTF per minute.
- Потому что final в JMM даёт дополнительные гарантии и при чтении значение из поля.
...
Рейтинг: 0 / 0
06.11.2014, 12:26
    #38797173
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как достигется потокобезопастность?
rema174как я понял из ваших слов, каждый раз при упоминании класса поинт будет создаваться экземпляр?

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


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

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


Нам экземпляр синглтона здесь нафиг не нужен. Но без внутреннего Holder-а он будет создани при инициализации класса Point.
вы уверены, что "без внутреннего Holder-а он будет создан при инициализации класса"?
т.к. выполнение этой строки не приводит к созданию объекта (экземпляра) синглтона, т.к. конструктор не срабатывает в классе показанном тут 16805165
...
Рейтинг: 0 / 0
06.11.2014, 13:14
    #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
06.11.2014, 13:22
    #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
06.11.2014, 13:34
    #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
06.11.2014, 13:39
    #38797259
rema174
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как достигется потокобезопастность?
ок, с отложенной инициализацией разобрались

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

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

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

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


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