Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / потоки и статические методы / 25 сообщений из 33, страница 1 из 2
13.12.2013, 01:16:37
    #38499368
Nik683
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
потоки и статические методы
Добрый день. Из-за недопонимания возникло сомнение в правильности реализации многопоточного приложения.
В случае если множество потоков асинхронно вызывают статические методы какого либо класса не приводит ли это к падению производительности. Не происходит ли задержка и ожидание одного потока пока другой поток не вышел из статического метода какого-то совместно используемого ими класса. (Вопросы синхронизации не рассматриваем- у используемого класса она ни к чему)
Вызываемые статические методы просты- типа :
public boolean getBool(int f)
{
if(f>9)
{return true;}else{return false;}
}

Не понятно как работает JVM в таком случае- если экземпляр класса содержащего статические методы создается один раз- должна происходить ожидание потоков на таких статических методах....?
...
Рейтинг: 0 / 0
13.12.2013, 08:22:07
    #38499464
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
потоки и статические методы
Nik683,
Вы заблуждаетесь. Никакой неявной синхронизации на статических методах нет.
Методы из множества потоков вызываются не 'асинхронно' а 'параллельно'.
...
Рейтинг: 0 / 0
13.12.2013, 08:55:48
    #38499494
Nik683
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
потоки и статические методы
Blazkowicz,

То есть для каждого потока JVM создает свой "экземпляр" статического класса?
...
Рейтинг: 0 / 0
13.12.2013, 08:56:38
    #38499495
Nik683
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
потоки и статические методы
Nik683,

...точнее класса содержащего статические методы...?
...
Рейтинг: 0 / 0
13.12.2013, 08:57:34
    #38499496
Nik683
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
потоки и статические методы
Nik683,

public static boolean ....
...
Рейтинг: 0 / 0
13.12.2013, 09:46:43
    #38499554
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
потоки и статические методы
Nik683,
Нет. Экземпляров столько, сколько было загружено класслоадерами. В норме правило примерно такое: один инстанс на одно изолированное приложение или один инстанс на всю JVM.
...
Рейтинг: 0 / 0
13.12.2013, 10:58:07
    #38499678
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
потоки и статические методы
Nik683То есть для каждого потока JVM создает свой "экземпляр" статического класса? тоже нет
...
Рейтинг: 0 / 0
13.12.2013, 10:59:02
    #38499679
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
потоки и статические методы
Nik683Nik683,

public static boolean ....
Отличный коментарий. Чтобы он значил?
...
Рейтинг: 0 / 0
13.12.2013, 11:12:13
    #38499693
Nik683
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
потоки и статические методы
Blazkowicz,

в первоначально вопросе метод объевил по ошибке не статическим
...
Рейтинг: 0 / 0
13.12.2013, 11:18:24
    #38499699
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
потоки и статические методы
Nik683в первоначально вопросе метод объевил по ошибке не статическим
Да, не важно. Мы пон е ли.
...
Рейтинг: 0 / 0
13.12.2013, 11:18:49
    #38499701
Nik683
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
потоки и статические методы
cdtyjv,

то есть на каждый поток свой класслоадер и соответственно свой экземпляр класса содержащего статические методы ?
...
Рейтинг: 0 / 0
13.12.2013, 11:20:04
    #38499704
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
потоки и статические методы
Nik683cdtyjv,
то есть на каждый поток свой класслоадер и соответственно свой экземпляр класса содержащего статические методы ?Нет. Что вам мешает прочитать документацию по этому вопросу, и не задавать множество глупых вопросов? :-)
...
Рейтинг: 0 / 0
13.12.2013, 11:22:03
    #38499707
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
потоки и статические методы
Nik683то есть на каждый поток свой класслоадер и соответственно свой экземпляр класса содержащего статические методы ?
Потоки отдельно, классы отдельно. Это две перепендикулярные сущности. Класслоадеры - отдельная тема связаная с классами, но не с потоками.
...
Рейтинг: 0 / 0
13.12.2013, 11:25:17
    #38499715
Nik683
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
потоки и статические методы
cdtyjv,

посоветуете где почитать?
...
Рейтинг: 0 / 0
13.12.2013, 11:38:38
    #38499731
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
потоки и статические методы
Nik683посоветуете где почитать?В Google, разумеется :-) Две ключевые фразы: "java static keyword", "java classloading". После этого все должно встать на свои места.
...
Рейтинг: 0 / 0
13.12.2013, 11:45:12
    #38499740
Nik683
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
потоки и статические методы
cdtyjv,

спасибо и на этом)
...
Рейтинг: 0 / 0
13.12.2013, 11:49:16
    #38499749
Nik683
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
потоки и статические методы
Blazkowicz,

именно поэтому у меня и возник вопрос по поводу того как разные потоки используют статические методы. каков внутренний механизм.
с одной стороны в литературе сказано что класс содержащий статический метод создается один раз. а с другой стороны если он создается один раз то как он без "конкуренции" используется разными потоками...
...
Рейтинг: 0 / 0
13.12.2013, 11:54:01
    #38499759
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
потоки и статические методы
Nik683как он без "конкуренции" используется разными потоками
Примерно так же как этот топик используется разными пользователями.
Метод это байт-код который можно читать и исполнять, не конкурируя.
...
Рейтинг: 0 / 0
13.12.2013, 11:58:37
    #38499773
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
потоки и статические методы
Nik683с одной стороны в литературе сказано что класс содержащий статический метод создается один раз

Нет. В литературе так не сказано. Либо привидите ссылку и цитату.

1) Класс создаётся один раз в контексте одной ветки иерархии класслоадеров.
Если это сложно с наскока понять, то в первом приближении, считайте что один класс на один класслоадер. Потому что на самом деле оно так и есть. Класс загруженый 2 раза разными classloader-ами это фактически 2 разных класса с точки зрения JVM.

2) Первое утверждение не зависит от наличия\отсутствия в классе статических методов. Оно истинно и для классов без статических методов.

Nik683а с другой стороны если он создается один раз то как он без "конкуренции" используется разными потоками...
3) Загрузка классов это одно. Исполнение классов это другое. Исполненик классов возможно только после загрузки. Загрузка синхронизирована внутренними средствами и происходит только один раз в первом потоке. Остальные потоки ждут загрузки класса если нужно.
А вот исполнение методов, как статических так и не статических происходит "конкурентно", если эти методы не синхронизированы.
К процессу загрузки это отношения не имеет. Так же как и не имеет отношения к статичности методов.

Приведите более внятный код, который бы помог вам прояснить ситуацию.
...
Рейтинг: 0 / 0
13.12.2013, 12:58:46
    #38499909
Nik683
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
потоки и статические методы
Blazkowicz,
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
package test;

public class TheS {
	
	public static double t=Math.random();
	
	public static void printSomething(Runnable rn) 
	{
		
		TheThread tr=(TheThread)rn;
		
		System.out.println(rn.toString()+" "+t+" "+tr.getF());
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(rn.toString()+" "+t);
		
	}

}



Код: 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.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
package test;

import java.util.ArrayList;

public class TheThread implements Runnable{

	
	private int f;
	
	public TheThread(int d)
	{
		this.setF(d);
	}
	
	@Override
	public void run() {
		int s=0;
		while(true)
		{			
			TheS.printSomething(this);
			
				if(s>f)
				{
					break;
				}
			
			s++;
		}
		
	}

	
	public static void main(String[] h)
	{
		ArrayList<Thread> ar=new ArrayList<Thread>();
		
		for(int f=0;f<20;f++)
		{
		ar.add(new Thread(new TheThread(f)));	
		}
		
		for(Thread g:ar)
		{
			g.start();
		}
		
	}

	public int getF() {
		return f;
	}

	public void setF(int f) {
		this.f = f;
	}
}



Вот такая тестовая ситуация, и у меня получается что все потоки используют один и тож же класс со статическим методом..
А если так то получается что один поток ждет пока другой освободит для него метод TheS.printSomething ?
...
Рейтинг: 0 / 0
13.12.2013, 13:03:40
    #38499921
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
потоки и статические методы
Ааа... мои глаза...
Срочно читать
http://www.oracle.com/technetwork/java/codeconv-138413.html
Или хотя бы найдите кнопку в вашей IDE которая код форматирует.
...
Рейтинг: 0 / 0
13.12.2013, 13:05:19
    #38499926
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
потоки и статические методы
Nik683А если так то получается что один поток ждет пока другой освободит для него метод TheS.printSomething ?
Нет. Они его выполняют параллельно и одновременно уходят в sleep(). Это легко проверить, если sleep сделать немного подольше, запустить в дебаге и нажать паузу. По стэку всех потоков вы увидите что каждый из них находится внутри printSomething, а не снаружи, как было бы при его синхронизации.
...
Рейтинг: 0 / 0
13.12.2013, 13:24:10
    #38499961
Nik683
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
потоки и статические методы
Blazkowicz,

А как это "физически" происходит ? Получается что для паралелmного выполнения для каждого потока должна создаваться некая "копия" класса TheS ?
...
Рейтинг: 0 / 0
13.12.2013, 13:34:12
    #38499978
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
потоки и статические методы
Nik683А как это "физически" происходит ?
"Физически" подразумевает что у вас уже есть некоторые представления о том как работают RAM и CPU компьютера?
Если, нет, то наверное стоит ненадолго отложить Java в сторону и почитать о внутреннем устройстве ПК.

Nik683Получается что для паралелmного выполнения для каждого потока должна создаваться некая "копия" класса TheS ?
Нет. Методы это команды процессору. Они не являются "критическим ресурсом". Потоки исполняют команды. Ничто не мешает разным потокам исполнять одни и те же команды одновременно. Метод это набор команд. Для исполнения метода, никаких копий метода создавать не нужно.

"Критическим ресурсом" является память. Память это поля. Как статические, так и нет. Ничто не мешает читать память потокам одновременно.

Это всё понятно? Методы и доступ к полям сами по себе не синхронизируются и могут производится одновременно разными потоками. Для их синхронизации нужно использовать специальные механизмы, чтобы организовать паралельный доступ так как нужно логике программы.

В JLS есть раздел о том что синхронизировано не явно. Это, например, загрузка и инициализация класса. Статические инициализаторы не исполняются паралелльно. Только одним потоком для одного класса.
...
Рейтинг: 0 / 0
13.12.2013, 13:43:35
    #38499993
Nik683
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
потоки и статические методы
Blazkowicz,

представление есть. насколько я понимаю метод TheS.printSomething есть набор команд в памяти (последовательность 1 и 0 в конечном итоге). И мне не понятно как это набор команд (если "физически" он один на всех) может одновременно выполнятся 100 потоками , даже если у нас например 8 процессоров.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / потоки и статические методы / 25 сообщений из 33, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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