Что следует учитывать при написании потокобезопасного кода:
1. Общие переменные
2. Изменяемые переменные
Общий означает, что несколько потоков могут получить к нему доступ одновременно, а изменяемый означает, что его значение может меняться в течение его жизненного цикла.
Например, следующая переменная count:
Скопируйте код кода следующим образом:
//Потоко-небезопасный класс
общественный класс UnsafeCount {
Private int count = 0 //Эта переменная является общей
public void увеличения() { //Здесь нет механизма синхронизации, несколько потоков могут получать доступ одновременно
count++; //Эта переменная является переменной
}
общественный int getCount() {
счетчик возврата;
}
}
Есть 4 способа решить эту проблему:
1. Вместо совместного использования переменной состояния среди потоков вы можете инкапсулировать ее в метод (объекты без сохранения состояния должны быть потокобезопасными, поскольку переменные в методе являются эксклюзивными для каждого потока и не используются совместно с другими потоками); например:
Скопируйте код кода следующим образом:
public int add(int count){
return ++count;//Здесь также можно сказать, что объекты без состояния должны быть потокобезопасными
}
2. Измените переменную состояния на неизменяемую переменную.
Скопируйте код кода следующим образом:
частный окончательный счетчик int = 0;
3. Используйте стратегию синхронизации при доступе к переменным состояния.
Скопируйте код кода следующим образом:
общедоступная синхронизированная недействительность увеличения () {
считать++;
}
4. Используйте атомарные классы переменных.
Скопируйте код кода следующим образом:
частный счетчик AtomicInteger;
публичное недействительное увеличение() {
count.getAndAdd(1);
}