Предположим, что есть многопоточная программа, в которой 15 потоков пишут и читают энергозависимые SynchronousQueue .И то же самое происходит с энергозависимым объектом, который содержит ConcurrentHashMap .Являются ли они потокобезопасными?
Я понимаю, что использование энергозависимых переменных не обеспечивает безопасности потоков, поскольку в них отсутствуют функции атомарности синхронизированных переменных, как объяснено здесь
Но что происходит при использованииvolatile Синхронные / параллельные структуры данных?
Извините за псевдокод, это всего лишь идея.Предположим, есть:
public class App implements Initializable {
private volatile Store store = new Store();
private volatile Producer[] producers = new Producer[15];
private volatile Consumer consumer = new Consumer();
private volatile SynchronousQueue<String[]> products;
ExecutorService(producers, consumer);
}
public class Store{
//Fully populated with 5000 > map.keyset() > 1000
private ConcurrentHashMap<Integer, String[]> map;
}
15 экземпляров / потоков:
public class Producer implements Runnable{
private static Store store;
private static SynchronousQueue>String[]> products;
public Producer(Store s, SynchronousQueue<String[]> p){
store = s;
products = p;
}
public run(){
read store.getMap();
create String[];
create id;
store.getMap().put(Integer, String[]);
products.put(String[]);
}
}
As Singleton:
public class Consumer implements Runnable{
public Consumer(Store s, SynchronousQueue<String[]> p){
store = s;
products = p;
}
public run(){
read store.getMap();
take products
writeToFile();
}
}
"15 производителей читают ConcurrentHashMap в Store,создайте продукт, измените ConcurrentHashMap и поместите новый продукт в SynchronousQueue. Между тем Потребитель постоянно получает содержимое SynchronousQueue. "