Использование изменчивых синхронных / параллельных Data-Structures потоков безопасно? - PullRequest
0 голосов
/ 07 июня 2019

Предположим, что есть многопоточная программа, в которой 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. "

...