Поведение статического метода в многопоточной среде на java
есть простой глупый вопрос, который беспокоит меня и делает несколько аргументов в моем уме. Я хочу выбросить все сомнения по поводу нижеприведенных вопросов.
class Clstest{
public static String testStaticMethod(String inFileStr) {
// section 0
// section 1
// do something with inFileStr
// section 2
// section 3
return inFileStr;
}
}
предположим, что есть пять потоков, каждый из которых выполняет вызов Clstest.testStaticMethod("arg-n")
одновременно.
поток 1 вызывает Clstest.testStaticMethod("arg-1")
.
когда поток 1 находится в разделе 1, поток 2 вызывает Clstest.testStaticMethod("arg-2")
.
тогда что будет с потоком 1? Перейдет ли он в состояние сна?
когда Поток 1 получил возможность возобновить выполнение из раздела 1, где он был приостановлен?
как это происходит, когда есть один Clstest.testStaticMethod
и все же Clstest.testStaticMethod
распределяются между всеми пятью потоками?
есть ли возможность поменять inFileStr
отправлено несколько потоков?
2 ответа:
Ганс проходе-это хорошо. Но я подумал, что попробую объяснить на немного более простом уровне для всех, кто сталкивается с этим и является новичком в Java. Вот так..
память в java делится на два вида - куча и стеки. Куча-это место, где живут все объекты, а стеки-это место, где потоки выполняют свою работу. Каждый поток имеет свой собственный стек и не может получить доступ к другим стекам. Каждый поток также имеет указатель на код, который указывает на бит код, который они сейчас выполняют.
когда поток запускает новый метод, он сохраняет Аргументы и локальные переменные в этом методе в своем собственном стеке. Некоторые из этих значений могут быть указатели на объекты в куче. Если два потока выполняют один и тот же метод одновременно, они оба будут иметь свои указатели кода, указывающие на этот метод, и иметь свои собственные копии аргументов и локальных переменных в своих стеках. Они будут только мешать друг другу, если что стеки указывают на одни и те же объекты в куче. В этом случае могут произойти самые разные вещи. Но, как указывает Ханс, строки неизменяемы (не могут быть изменены), поэтому мы в безопасности, если это единственный объект, который "разделяется".
Так много потоков может быть запущен один и тот же метод. Они могут не работать одновременно - это зависит от того, сколько ядер у вас есть на вашем компьютере, поскольку JVM сопоставляет потоки Java с потоками ОС, которые запланированы на аппаратные потоки. Поэтому у вас мало контроля по пути эти потоки чередуются без использования сложных синхронизация механизмы.
обратите внимание, что сон-это то, что поток делает сам с собой.
перейдет ли он в состояние сна?
нет, запуск потока не влияет на другие потоки, пока они намеренно не синхронизируются друг с другом. Если у вас есть несколько процессорных ядер, все последние машины делают это, эти потоки, вероятно, будут выполняться в одно и то же время. Это становится немного менее вероятным, когда вы запускаете 5 потоков, так как ваша машина может не иметь достаточного количества ядер. Операционная система вынуждена выбирать между ними, отдавая их каждому какое-то время бежать. Задание планировщика потоков. Поток тогда не будет находиться в состоянии" сна", он просто приостановлен и ждет планировщика потока, чтобы дать ему возможность работать. Он возобновится там, где он был прерван планировщиком.
есть ли возможность обмена инфильтрата, отправленного несколькими потоками?
такой возможности нет, потоки имеют свой собственный стек, поэтому любой аргумент метода и локальная переменная будут уникальными для каждый поток. Используя строка кроме того, гарантирует, что эти потоки не мешают друг другу, так как строки являются неизменными.
нет такой гарантии, если аргумент является ссылкой на другой вид изменяемого объекта. Или если сам метод использует переменные, которые являются статическими или ссылки на объекты в куче. Синхронизация требуется, когда поток изменяет объект, а другой поток читает. Элемент замок ключевое слово в C# язык является шаблонным способом реализации такой необходимой синхронизации. Дело в том, что метод статический не означает, что такая синхронизация никогда не требуется. Просто менее вероятно, так как вам не нужно беспокоиться о потоках, обращающихся к одному и тому же объекту (sharing этой).