powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / test synchronized vs ReentrantLock
25 сообщений из 49, страница 1 из 2
test synchronized vs ReentrantLock
    #38421390
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
помогите понять почему 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
test synchronized vs ReentrantLock
    #38421400
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно посмотреть на код для 10 потоков.
...
Рейтинг: 0 / 0
test synchronized vs ReentrantLock
    #38421406
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczИнтересно посмотреть на код для 10 потоков.

:) просто копировал.
чтобы понять как растет время , а оно растет .
...
Рейтинг: 0 / 0
test synchronized vs ReentrantLock
    #38421414
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А давайте в качестве эксперимента, поменяем очередность теста и посмотрим результат.
...
Рейтинг: 0 / 0
test synchronized vs ReentrantLock
    #38421420
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
test synchronized vs ReentrantLock
    #38421424
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По этим двум результатам запускал цикл . результаты примерно такие в серии из 100 циклов.
...
Рейтинг: 0 / 0
test synchronized vs ReentrantLock
    #38421436
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
test synchronized vs ReentrantLock
    #38421498
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь низкоуровневые объяснения
http://cheremin.blogspot.com/2011/11/synchronized-vs-reentrantlock.html
По всем остальным тестам в гугле - выводы такие же.
Lock как API имеет ряд фич, которые труднее реализовать с synchronized.
Lock действительно быстрее при высокой конкуретности. Т.е. как в вышеприведенном тесте, потоки постоянно в борьбе за ресурс.
synchronized будет быстрее в однопоточном исполнении за счет Biased Locking.
Разницы при небольшой конкуретности особой нет, можно пользовать и то и другое, к тому же объем критической секции почти всегда нивелирует разницу в производительности между этими блокировками.
...
Рейтинг: 0 / 0
test synchronized vs ReentrantLock
    #38421597
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
test synchronized vs ReentrantLock
    #38421621
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1Насколько провисает производительность при получении ссылки на фабрику в многопоточной среде ...
Если фабрика используется в jsp страницах для получения данных.
На децл, но провисает. Чем больше юзеров, тем больше задержка. Для сервера не очень хороший код. Че было не взять любой IoC DI контейнер не понятно.
...
Рейтинг: 0 / 0
test synchronized vs ReentrantLock
    #38421625
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1 ,
Если не хотите провисать, то сделайте double-checked locking, и вопрос про synchronized/lock отпадет сам собой: http://habrahabr.ru/post/143390/
...
Рейтинг: 0 / 0
test synchronized vs ReentrantLock
    #38421654
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvЕсли не хотите провисать, то сделайте double-checked locking, и вопрос про synchronized/lock отпадет сам собой: http://habrahabr.ru/post/143390/
Я где-то читал что новые гарантии JMM в Java 6 хоть и улучшают ситуацию с DCL, но не исправляют её окончательно.
...
Рейтинг: 0 / 0
test synchronized vs ReentrantLock
    #38421655
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjv Atum1 ,
Если не хотите провисать, то сделайте double-checked locking, и вопрос про synchronized/lock отпадет сам собой: http://habrahabr.ru/post/143390/
DCL не нужен, если использовать ленивость Java через дополнительный Holder класс.
...
Рейтинг: 0 / 0
test synchronized vs ReentrantLock
    #38421710
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczЯ где-то читал что новые гарантии JMM в Java 6 хоть и улучшают ситуацию с DCL, но не исправляют её окончательно.
DCL не нужен, если использовать ленивость Java через дополнительный Holder класс.По приведенной выше ссылке оба эти вопроса рассматриваются в деталях. Классический DCL работает через synchronized + volatile начиная с 5.0.
...
Рейтинг: 0 / 0
test synchronized vs ReentrantLock
    #38423726
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvBlazkowiczЯ где-то читал что новые гарантии JMM в Java 6 хоть и улучшают ситуацию с DCL, но не исправляют её окончательно.
DCL не нужен, если использовать ленивость Java через дополнительный Holder класс.По приведенной выше ссылке оба эти вопроса рассматриваются в деталях. Классический DCL работает через synchronized + volatile начиная с 5.0.

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

хотя да нужен, может ведь не весь адрес записаться
...
Рейтинг: 0 / 0
test synchronized vs ReentrantLock
    #38435619
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самый показательный результат дает 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
test synchronized vs ReentrantLock
    #38435646
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
test synchronized vs ReentrantLock
    #38435677
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теперь вопрос как правильно написать 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
test synchronized vs ReentrantLock
    #38435683
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1Теперь вопрос как правильно написать Singleton через AtomicReference , так чтобы он возвращал еще быстрее , можно создать пул который будет пополняться экземплярами класса Singleton - и забираться по AtomicReference при вызове.

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

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

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

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


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