Когда вам нужно беспокоиться о безопасности потоков? - PullRequest
5 голосов
/ 15 декабря 2010

В каких ситуациях вам нужно беспокоиться о том, является ли статический метод поточно-ориентированным?

Например, если у меня есть статическая служебная функция, которая не касается каких-либо статических переменных уровня класса, это методуже потокобезопасен?Если у меня есть статический метод, который касается статических переменных класса, этот метод потенциально не безопасен для потоков?

Заранее спасибо.

Ответы [ 7 ]

6 голосов
/ 15 декабря 2010

Если у меня есть статическая служебная функция, которая не затрагивает статические переменные уровня класса, этот метод уже безопасен для потоков?

В большинстве случаев важно, чтобы ваш метод был reentrant .Нечто подобное повторяется, потому что все являются локальными переменными, и каждый поток получает свою собственную копию:

static int add(int a, int b)
{
    return a + b;
}

Есть еще некоторые вещи, о которых следует позаботиться.Если вы передаете объект методу, а метод мутирует объект, и перед завершением метода вы снова вызываете тот же метод в другом потоке, но с тем же объектом , тогда возникает проблема.

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

Основная проблема снова заключается в том, являются ли переменные изменяемыми.Если вы читаете только из неизменяемых объектов, то проблем может не быть.

Если вы вызываете метод, и вы не уверены, является ли он реентерабельным, а документация не говорит, лучше предположить, что оннет.

5 голосов
/ 15 декабря 2010

Если вы используете только локальные переменные стека в статическом методе, то нет причин для беспокойства. java.lang.Math.min (int, int) является хорошим примером такого метода. Но в случае, если вы касаетесь каких-либо общих статических переменных или объектов, которые действительно имеют состояние (то есть не неизменяемое), вам придется использовать синхронизацию.

3 голосов
/ 15 декабря 2010

Вам нужно беспокоиться о безопасности потоков, когда у вас есть несколько потоков, обращающихся к одним и тем же ресурсам.

Ваш статический метод может быть небезопасным, если он использует те же ресурсы, что и другие потоки - прямо или косвенно - даже если эти ресурсы не являются статическими переменными класса.

2 голосов
/ 15 декабря 2010

Если у вас есть метод, который записывает в любое состояние, которое совместно используется несколькими потоками (например, статическими переменными или любыми объектами, которые используют несколько потоков), тогда этот метод должен беспокоиться о безопасности потокови то же самое делают любые методы, которые читают любое из этого общего состояния.

2 голосов
/ 15 декабря 2010

Вам нужно беспокоиться о безопасности потоков, когда у вас есть несколько потоков, обращающихся к одним и тем же ресурсам, и эти ресурсы не являются неизменными.

2 голосов
/ 15 декабря 2010

Потокобезопасен, если нет доступа к изменяемым ресурсам, таким как переменные класса, однако вы должны убедиться, что ваш метод не вызывает никаких других методов, которые обращаются к каким-либо изменяемым ресурсам.

0 голосов
/ 15 декабря 2010

Безопасность потоков становится проблемой, если существует хотя бы одна точка входа, к которой могут обращаться несколько потоков.

Если часть кода доступна нескольким потокам и вызывает другой метод / класс / и т. Д.., тогда все это кодовое дерево становится уязвимым.

Из "Практического параллелизма Java": Первый шаг в организации программы вокруг выполнения задачи - это определение разумных границ задачи.В идеале задачи - это самостоятельные действия: работа, которая не зависит от состояния, результата или побочных эффектов других задач.Независимость облегчает параллелизм, поскольку независимые задачи могут выполняться параллельно при наличии достаточных ресурсов обработки.

Например, если вы пишете изолированный сервлет, который гарантированно будет выполняться одним потоком,тебе не нужно беспокоиться.Но если вы пишете статическую утилиту, которая используется разными сервлетами, то она должна быть сделана для обработки многопоточного доступа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...