Сделайте потокобезопасным нормальный класс с ThreadLocal <T> - PullRequest
0 голосов
/ 30 декабря 2010

У меня есть нормальный класс, предназначенный для доступа к одному потоку, и я хочу сделать его thread-safe, чтобы многие потоки могли использовать один экземпляр одновременно.Есть некоторые методы и переменные уровня класса, которые я сделаю статическими, и используя locks, сделаю их thread-safe.Также методы, которые только используют локальные переменные, по умолчанию безопасны (каждый поток имеет свой стек).

Мой вопрос о properties старого класса или, в более общем случае, о любой переменной non-static,Могу ли я просто использовать ThreadLocal<T>, и каждый поток имеет свой собственный набор properties?Конечно, я буду использовать locks и другие thread-safety проблемы внутри setters (я полагаю, getters безопасны).

И ThreadLocal<T> убийца производительности?

Ответы [ 2 ]

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

добытчики не так безопасны, как вы думаете.Модель памяти Java дает каждому потоку свое собственное представление о куче, поэтому, если вы не синхронизируете доступ к переменным, потоки могут читать устаревшие данные.Создание переменной volatile предотвратит устаревшие чтения и подходит для примитивов, но volatile не сделает атомарный доступ.

В пакете java.util.concurrent есть несколько классов, которые могут помочь,Написание поточно-ориентированного кода довольно сложно, поэтому я бы порекомендовал получить хорошую книгу по этому вопросу.«Параллелизм Java на практике» Брайана Гетца довольно хорош.

1 голос
/ 30 декабря 2010

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

В вашем случае я бы предложил изменить тип поля на Map<Object, Object> и использовать Collections.synchronizedMap, чтобы сделать его потокобезопасным.

...