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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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