Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / test synchronized vs ReentrantLock / 25 сообщений из 49, страница 1 из 2
09.10.2013, 12:43
    #38421390
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
test synchronized vs ReentrantLock
помогите понять почему synchronized так сильно проигрывает ReentrantLock ?

run:
lock.lock()
5000000
Time spent: 0.234059174 sec

syninc
5000000
Time spent: 0.989136139 sec

у меня получается что с каждым новым тредом время растет линейно у synchronized! я начал с 2x тредов и до 5 !

Параметры JVM ставил разные :

XX:-UseBiasedLocking

секция synchronized - дорогая , возможно если поток завладел ей и его ОС отложила,то все остальные ждут

но если шедулер ОС остановит Lock, тоже все буду ждать, так же ? или нет ?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.logging.Level;
import java.util.logging.Logger;


public class TwoThreads {

    public static int counter = 0;
    public static volatile int N = 1000000;
    public static Lock lock = new ReentrantLock();

    public synchronized static int getCounter() {
        return counter;
    }

    public static void inc() {
        lock.lock();
        try {
            counter++;
        } finally {
            lock.unlock();
        }

    }

    public synchronized static void syninc() {
        counter++;
    }

    interface Lambda {

        void apply();
    }

    static long timeIt(Lambda lambda) {
        long start = System.nanoTime();
        lambda.apply();
        long end = System.nanoTime();
        long result = end - start;
        System.out.println("Time spent: " + (result) / 1000000000d + " sec\n");
        return result;
    }

    public static void main(String[] args) throws InterruptedException {

            System.out.println("lock.lock() ");
            timeIt(new Lambda() {
                @Override
                public void apply() {

                    Thread t1 = new Thread(new Runnable() {
                        @Override
                        public void run() {
                            for (int i = 0; i < N; i++) {
                                inc();
                            }
                        }
                    });




                    Thread t2 = new Thread(new Runnable() {
                        @Override
                        public void run() {
                            for (int i = 0; i < N; i++) {
                                inc();

                            }
                        }
                    });
                    Thread t3 = new Thread(new Runnable() {
                        @Override
                        public void run() {
                            for (int i = 0; i < N; i++) {
                                inc();

                            }
                        }
                    });
                    Thread t4 = new Thread(new Runnable() {
                        @Override
                        public void run() {
                            for (int i = 0; i < N; i++) {
                                inc();

                            }
                        }
                    });
                    Thread t5 = new Thread(new Runnable() {
                        @Override
                        public void run() {
                            for (int i = 0; i < N; i++) {
                                inc();

                            }
                        }
                    });

                    t1.start();
                    t2.start();
                    t3.start();
                    t4.start();
                    t5.start();
                    try {
                        t1.join();
                    } catch (InterruptedException ex) {
                        Logger.getLogger(TwoThreads.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    try {
                        t2.join();
                    } catch (InterruptedException ex) {
                        Logger.getLogger(TwoThreads.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    try {
                        t3.join();
                    } catch (InterruptedException ex) {
                        Logger.getLogger(TwoThreads.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    try {
                        t4.join();
                    } catch (InterruptedException ex) {
                        Logger.getLogger(TwoThreads.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    try {
                        t5.join();
                    } catch (InterruptedException ex) {
                        Logger.getLogger(TwoThreads.class.getName()).log(Level.SEVERE, null, ex);
                    }

                    System.out.println(counter);


                }
            });
            counter = 0;
            System.out.println("syninc ");
            timeIt(new Lambda() {
                @Override
                public void apply() {

                    Thread t1 = new Thread(new Runnable() {
                        @Override
                        public void run() {
                            for (int i = 0; i < N; i++) {
                                syninc();
                            }
                        }
                    });




                    Thread t2 = new Thread(new Runnable() {
                        @Override
                        public void run() {
                            for (int i = 0; i < N; i++) {
                                syninc();

                            }
                        }
                    });
                    
                    Thread t3 = new Thread(new Runnable() {
                        @Override
                        public void run() {
                            for (int i = 0; i < N; i++) {
                                syninc();

                            }
                        }
                    });
                    Thread t4 = new Thread(new Runnable() {
                        @Override
                        public void run() {
                            for (int i = 0; i < N; i++) {
                                syninc();

                            }
                        }
                    });
                    Thread t5 = new Thread(new Runnable() {
                        @Override
                        public void run() {
                            for (int i = 0; i < N; i++) {
                                syninc();

                            }
                        }
                    });

                    t1.start();
                    t2.start();
                    t3.start();
                    t4.start();
                    t5.start();
                    try {
                        t1.join();
                    } catch (InterruptedException ex) {
                        Logger.getLogger(TwoThreads.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    try {
                        t2.join();
                    } catch (InterruptedException ex) {
                        Logger.getLogger(TwoThreads.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    try {
                        t3.join();
                    } catch (InterruptedException ex) {
                        Logger.getLogger(TwoThreads.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    try {
                        t4.join();
                    } catch (InterruptedException ex) {
                        Logger.getLogger(TwoThreads.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    try {
                        t5.join();
                    } catch (InterruptedException ex) {
                        Logger.getLogger(TwoThreads.class.getName()).log(Level.SEVERE, null, ex);
                    }

                    System.out.println(counter);


                }
            });





    }
}
...
Рейтинг: 0 / 0
09.10.2013, 12:46
    #38421400
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
test synchronized vs ReentrantLock
Интересно посмотреть на код для 10 потоков.
...
Рейтинг: 0 / 0
09.10.2013, 12:49
    #38421406
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
test synchronized vs ReentrantLock
BlazkowiczИнтересно посмотреть на код для 10 потоков.

:) просто копировал.
чтобы понять как растет время , а оно растет .
...
Рейтинг: 0 / 0
09.10.2013, 12:50
    #38421414
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
test synchronized vs ReentrantLock
А давайте в качестве эксперимента, поменяем очередность теста и посмотрим результат.
...
Рейтинг: 0 / 0
09.10.2013, 12:52
    #38421420
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
test synchronized vs ReentrantLock
BlazkowiczА давайте в качестве эксперимента, поменяем очередность теста и посмотрим результат.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
                Thread[] threads = new Thread[threadCount];
                    for (int i = 0; i < threadCount; i++) {
                        threads[i] = new Thread(new Runnable() {
                            @Override
                            public void run() {
                                for (int i = 0; i < N; i++) {
                                    inc();
                                }
                            }
                        });
                    }
                    
                    for (int i = 0; i < threads.length; i++) {
                        threads[i].start();
                    }
                    
                    for (int i = 0; i < threads.length; i++) {
                        try {
                            threads[i].join();
                        } catch (InterruptedException ex) {
                            Logger.getLogger(TwoThreads.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }

                    System.out.println(counter);
...
Рейтинг: 0 / 0
09.10.2013, 12:54
    #38421424
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
test synchronized vs ReentrantLock
По этим двум результатам запускал цикл . результаты примерно такие в серии из 100 циклов.
...
Рейтинг: 0 / 0
09.10.2013, 12:58
    #38421436
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
test synchronized vs ReentrantLock
BlazkowiczА давайте в качестве эксперимента, поменяем очередность теста и посмотрим результат.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author i.salnikov
 */
public class TwoThreads {

    public static int counter = 0;
    public static int threadCount = 10;
    public static volatile int N = 1000000;
    public static Lock lock = new ReentrantLock();

    public synchronized static int getCounter() {
        return counter;
    }

    public static void inc() {
        lock.lock();
        try {
            counter++;
        } finally {
            lock.unlock();
        }

    }

    public synchronized static void syninc() {
        counter++;
    }

    interface Lambda {

        void apply();
    }

    static long timeIt(Lambda lambda) {
        long start = System.nanoTime();
        lambda.apply();
        long end = System.nanoTime();
        long result = end - start;
        System.out.println("Time spent: " + (result) / 1000000000d + " sec\n");
        return result;
    }
    
    
    public static void fThreadCount(int threadCountI, final Lambda lambda){
                   Thread[] threads = new Thread[threadCountI];
                    for (int i = 0; i < threadCountI; i++) {
                        threads[i] = new Thread(new Runnable() {
                            @Override
                            public void run() {
                                for (int i = 0; i < N; i++) {
                                    lambda.apply();
                                }
                            }
                        });
                    }
                    
                    for (int i = 0; i < threads.length; i++) {
                        threads[i].start();
                    }
                    
                    for (int i = 0; i < threads.length; i++) {
                        try {
                            threads[i].join();
                        } catch (InterruptedException ex) {
                            Logger.getLogger(TwoThreads.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }

                    System.out.println(counter);
    }

    public static void main(String[] args) throws InterruptedException {
        for (int i = 0; i < threadCount; i++) {
           
            
      
            System.out.println("lock.lock() ");
            timeIt(new Lambda() {
                @Override
                public void apply() {
                 fThreadCount(threadCount,new Lambda() {
                     @Override
                     public void apply() {
                         inc();
                     }
                 });

                }
            });
            
            counter = 0;
            System.out.println("syninc ");
                     timeIt(new Lambda() {
                @Override
                public void apply() {
                 fThreadCount(threadCount,new Lambda() {
                     @Override
                     public void apply() {
                         syninc();
                     }
                 });

                }
            });
        }
    }
}
...
Рейтинг: 0 / 0
09.10.2013, 13:31
    #38421498
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
test synchronized vs ReentrantLock
Здесь низкоуровневые объяснения
http://cheremin.blogspot.com/2011/11/synchronized-vs-reentrantlock.html
По всем остальным тестам в гугле - выводы такие же.
Lock как API имеет ряд фич, которые труднее реализовать с synchronized.
Lock действительно быстрее при высокой конкуретности. Т.е. как в вышеприведенном тесте, потоки постоянно в борьбе за ресурс.
synchronized будет быстрее в однопоточном исполнении за счет Biased Locking.
Разницы при небольшой конкуретности особой нет, можно пользовать и то и другое, к тому же объем критической секции почти всегда нивелирует разницу в производительности между этими блокировками.
...
Рейтинг: 0 / 0
09.10.2013, 14:35
    #38421597
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
test synchronized vs ReentrantLock
BlazkowiczЗдесь низкоуровневые объяснения
http://cheremin.blogspot.com/2011/11/synchronized-vs-reentrantlock.html
По всем остальным тестам в гугле - выводы такие же.
Lock как API имеет ряд фич, которые труднее реализовать с synchronized.
Lock действительно быстрее при высокой конкуретности. Т.е. как в вышеприведенном тесте, потоки постоянно в борьбе за ресурс.
synchronized будет быстрее в однопоточном исполнении за счет Biased Locking.
Разницы при небольшой конкуретности особой нет, можно пользовать и то и другое, к тому же объем критической секции почти всегда нивелирует разницу в производительности между этими блокировками.

Ок! спасибо! Буду теперь думать где что применять :)

А вопрос у меня возник , когда наткнулся на такой код singleton :

Код: java
1.
2.
3.
4.
5.
6.
public static synchronized ServiceFactory getInstance() {
        if(instance == null) {
            instance = new ServiceFactory();
        }
        return instance;
    }  



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

Если фабрика используется в jsp страницах для получения данных.
...
Рейтинг: 0 / 0
09.10.2013, 14:47
    #38421621
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
test synchronized vs ReentrantLock
Atum1Насколько провисает производительность при получении ссылки на фабрику в многопоточной среде ...
Если фабрика используется в jsp страницах для получения данных.
На децл, но провисает. Чем больше юзеров, тем больше задержка. Для сервера не очень хороший код. Че было не взять любой IoC DI контейнер не понятно.
...
Рейтинг: 0 / 0
09.10.2013, 14:48
    #38421625
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
test synchronized vs ReentrantLock
Atum1 ,
Если не хотите провисать, то сделайте double-checked locking, и вопрос про synchronized/lock отпадет сам собой: http://habrahabr.ru/post/143390/
...
Рейтинг: 0 / 0
09.10.2013, 15:02
    #38421654
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
test synchronized vs ReentrantLock
cdtyjvЕсли не хотите провисать, то сделайте double-checked locking, и вопрос про synchronized/lock отпадет сам собой: http://habrahabr.ru/post/143390/
Я где-то читал что новые гарантии JMM в Java 6 хоть и улучшают ситуацию с DCL, но не исправляют её окончательно.
...
Рейтинг: 0 / 0
09.10.2013, 15:02
    #38421655
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
test synchronized vs ReentrantLock
cdtyjv Atum1 ,
Если не хотите провисать, то сделайте double-checked locking, и вопрос про synchronized/lock отпадет сам собой: http://habrahabr.ru/post/143390/
DCL не нужен, если использовать ленивость Java через дополнительный Holder класс.
...
Рейтинг: 0 / 0
09.10.2013, 15:28
    #38421710
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
test synchronized vs ReentrantLock
BlazkowiczЯ где-то читал что новые гарантии JMM в Java 6 хоть и улучшают ситуацию с DCL, но не исправляют её окончательно.
DCL не нужен, если использовать ленивость Java через дополнительный Holder класс.По приведенной выше ссылке оба эти вопроса рассматриваются в деталях. Классический DCL работает через synchronized + volatile начиная с 5.0.
...
Рейтинг: 0 / 0
10.10.2013, 23:13
    #38423726
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
test synchronized vs ReentrantLock
cdtyjvBlazkowiczЯ где-то читал что новые гарантии JMM в Java 6 хоть и улучшают ситуацию с DCL, но не исправляют её окончательно.
DCL не нужен, если использовать ленивость Java через дополнительный Holder класс.По приведенной выше ссылке оба эти вопроса рассматриваются в деталях. Классический DCL работает через synchronized + volatile начиная с 5.0.

собственно секция synchronized для singleton при получении ссылки и не нужна .
Как мне кажется компилятор должен ее убрать через какое то количество циклов , если он умный .
...
Рейтинг: 0 / 0
11.10.2013, 08:40
    #38423935
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
test synchronized vs ReentrantLock
Atum1собственно секция synchronized для singleton при получении ссылки и не нужна .
Как мне кажется компилятор должен ее убрать через какое то количество циклов , если он умный .Не совсем понял, что вы имеете ввиду. Если вы про классический double-checked locking, то там используется связка volatile + synchronized. Да, после инициализации мы не будем приходить в ветку с synchronized, но компилятор не сможет ее выкинуть, так как не сможет заоптимизировать первую проверку на null, ибо она идет по volatile полю.
...
Рейтинг: 0 / 0
11.10.2013, 10:54
    #38424088
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
test synchronized vs ReentrantLock
Господа не поясните тупому, а нужен ли volatile при DCL если проверку развернуть на противоположную?
...
Рейтинг: 0 / 0
11.10.2013, 10:57
    #38424095
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
test synchronized vs ReentrantLock
Сергей АрсеньевГоспода не поясните тупому, а нужен ли volatile при DCL если проверку развернуть на противоположную?
Код покажи. Многопоточное создание экземпляра как отработает?
...
Рейтинг: 0 / 0
11.10.2013, 10:57
    #38424096
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
test synchronized vs ReentrantLock
Сергей Арсеньев,

хотя да нужен, может ведь не весь адрес записаться
...
Рейтинг: 0 / 0
21.10.2013, 15:00
    #38435619
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
test synchronized vs ReentrantLock
Самый показательный результат дает AtomicInteger

При N= 100000000 и 10 потоках он рвет и synchronized и обходит lock()


Код: java
1.
2.
3.
4.
5.
public static AtomicInteger iCounter = new AtomicInteger(0);

    public static int getInstance() {
        return iCounter.incrementAndGet();
    }



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
lock.lock() 
100000000
Time spent: 5.434246025 sec

syninc 
100000000
Time spent: 21.641281703 sec

AtomicReference 
100000000
Time spent: 3.083562757 sec
...
Рейтинг: 0 / 0
21.10.2013, 15:11
    #38435646
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
test synchronized vs ReentrantLock
Atum1Самый показательный результат дает AtomicInteger
Открыл глаза. Google -> CAS -> Lock Free, etc

Atum1При N= 100000000 и 10 потоках он рвет и synchronized и обходит lock()

Потому что CAS это не блокировка. А Lock и synchronized - это блокировка.


Atum1lock.lock() - 5.434246025 sec
syninc - 21.641281703 sec
AtomicReference - 3.083562757 sec

Тест меряет максимальную нагрузку на лок - идет постоянная конкуренция. Только в этом случае Lock дает значительные выигрышь перед synchronized. Т.е. это единственный критерий. Надобность в такой блокировке возникает не часто. А если она возникает часто, то можно подумать над тем как реализовать то же самое без критической секции вообще.
В то же время при низкой конкуренкции synchronized может выдать лучшую производительность за счет Biased Locking или просто такую же как RL.
...
Рейтинг: 0 / 0
21.10.2013, 15:22
    #38435677
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
test synchronized vs ReentrantLock
Теперь вопрос как правильно написать Singleton через AtomicReference , так чтобы он возвращал еще быстрее , можно создать пул который будет пополняться экземплярами класса Singleton - и забираться по AtomicReference при вызове.

Пример :

Есть сервлет - в котором есть ссылка на сonfig - это Map<String, String> ключ значение .

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

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
 
@Repository
public class SiteConfigSeriveImpl extends implements SiteConfigSerive{
private ConcurrentMap<String, String> сonfig;

    @Override
    public SiteKeyConfig save(SiteKeyConfig cfg) {
        cfg = super.save(cfg);
        load();
        return cfg;
    }

   @Transactional
    public void load() {
        ConcurrentMap<String, String>  tmp= new ConcurrentHashMap<String, String>();
        DetachedCriteria detachedCriteria //  запрос на заполнение 
        List<SiteKeyConfig> siteKeyConfigs =  getByCriteria(detachedCriteria, 0, 100);
        for (SiteKeyConfig siteKeyConfig : siteKeyConfigs) {
           tmp.put(siteKeyConfig.getKey(),siteKeyConfig.getValue());
       }
       this.сonfig = tmp;
    }


    @Override
    public Map<String, String> getConfig() {
        return сonfig ;
    }



код сервлета :

Код: java
1.
2.
3.
4.
5.
 @Autowired
  private SiteConfigSerive siteConfig;
...
 String str = siteConfig.getConfig().get("key1");
...



т.е. в Местах обращения к siteConfig.getConfig() и получения ссылки на единственный экземпляр ConcurrentMap<String, String> мы будем иметь конкуренцию

За ссылку siteConfig ???

чтобы ее снять какие действия нам нужно предпринять ?

Добавить в класс SiteConfigSeriveImpl pool из AtomicReference из ConcurrentMap<String, String> сonfig; которые мы будем постоянно насыщать ... и отдавать при запросах ?
...
Рейтинг: 0 / 0
21.10.2013, 15:25
    #38435683
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
test synchronized vs ReentrantLock
Atum1Теперь вопрос как правильно написать Singleton через AtomicReference , так чтобы он возвращал еще быстрее , можно создать пул который будет пополняться экземплярами класса Singleton - и забираться по AtomicReference при вызове.

http://www.rsdn.ru/forum/java/4473617
http://stackoverflow.com/questions/5938163/singleton-using-atomicreference
...
Рейтинг: 0 / 0
21.10.2013, 18:32
    #38436016
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
test synchronized vs ReentrantLock
Blazkowicz http://www.rsdn.ru/forum/java/4473617
http://stackoverflow.com/questions/5938163/singleton-using-atomicreference

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

Во втором случае можно получить не полностью инициализированный instance.

И оно того стоит?
...
Рейтинг: 0 / 0
21.10.2013, 18:34
    #38436020
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
test synchronized vs ReentrantLock
Сергей АрсеньевИ оно того стоит?
Дык и я о том же.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / test synchronized vs ReentrantLock / 25 сообщений из 49, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]