Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18

TRICKS: Срыв покровов - батлнек локинг

20.02.2014, 11:53. Показов 1161. Ответов 5

Студворк — интернет-сервис помощи студентам
Надеюсь все вкурсе что в JVM некоторые боксированные объекты, а также строки кешируются, к примеру Integer до 127.
Что же мы можем получить при мультипоточной обработке если к примеру у нас объекты для мониторов синхронизации будут закешированны?
Проверим, идея для теста такая:
создадим 30000 хешмапов с ключами от 0 до 127 и попробуем засинхронизироваться на ключи

по коду видно что среднее время возвращаемое футурками должно быть около 3-4 мс, но так как претендентов на синхронизацию аж 30000 а реальных объектов с мониторами всего 128, то у нас будет расти среднее время выполнения по мере накопления тридов в очереди на лок.
Что нам и демонстрирует код
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
package tricks;
 
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.*;
 
/**
 * Created by mutagen on 19.02.14.
 */
public class AutoboxLock implements Callable<Long> {
    private Map<Integer, Command> map;
 
    public AutoboxLock(Map<Integer, Command> map) {
        this.map = map;
    }
 
    public static void main(String[] args) {
 
        ExecutorService es = Executors.newFixedThreadPool(500);
        ArrayList<Future<Long>> rez = new ArrayList<>();
        for (int i = 0; i < 30000; i++) {
            rez.add(es.submit(new AutoboxLock(getMap())));
        }
        es.shutdown();
        for (Future<Long> f : rez) {
            try {
                System.out.println(f.get());
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }
    }
 
    static Map<Integer, Command> getMap() {
        HashMap<Integer, Command> hashMap = new HashMap<>();
        for (int i = 0; i < 127; i++) {
            hashMap.put(i, new Command());
        }
        return hashMap;
    }
 
    long exeMap(Map<Integer, Command> map) {
        Set<Integer> set = map.keySet();
        long start = System.currentTimeMillis();
        for (Integer key : set) {
            synchronized (key) {
                map.get(key).exe();
            }
        }
        return (System.currentTimeMillis() - start) / set.size();
    }
 
    @Override
    public Long call() throws Exception {
        return this.exeMap(this.map);
    }
 
    static class Command {
        public void exe() {
            try {
                Thread.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
Что же у нас получилось, я выделил 500 потоков, а реально работали только 127, примерно такие же вещи происходят если синхриться по совпадающим строкам.
Я бы не сказал что это баг, скорее фича

Добавлено через 16 часов 21 минуту
ну вот так и срывай покровы )
никому не интересно ?

где каменты?
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.02.2014, 11:53
Ответы с готовыми решениями:

срыв стека silabs C8051F410
Всем привет! Определяю кучу массивов. Когда часть из них закоментирую, то контроллер работает нормально, иначе виснет... точнее циклится...

USART срыв синронизации при потоке данных
Имеется плата stm32f3disc . Использую USORT1 с ремапом PA9 PA10. tx подключен на rx мычкой. т.е передача прием сам на себя . скорость 9600...

Срыв передачи I2C при подключении осциллографа
Здравствуйте, уважемые! Есть осциллограф DSO203 с двумя входами. В нём же есть логический анализатор. Если подключаю его к шине I2C...

5
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
20.02.2014, 12:06
Пример довольно скучный - уже наверное все знают, что Integer обязательно кэшируется до 127.
И излишне усложненный - зачем hashmap? Зачем лишний класс command?
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
20.02.2014, 18:43  [ТС]
Цитата Сообщение от turbanoff Посмотреть сообщение
Пример довольно скучный - уже наверное все знают, что Integer обязательно кэшируется до 127.
и то что строки интернируются и кешируются знают и то что шорты тоже и то что пост не про кеширование а про синхронизацию,
и то что от вас ни спасиба ни дождёшься ни хотя-бы положительного отзыва
хорошо что вы ещё другим помогаете и не скучаете
0
20.02.2014, 19:46

Не по теме:

Иллюстрированный случай слишком прост, для тех кто может прочитать этот код.

Цитата Сообщение от mutagen Посмотреть сообщение
и то что от вас ни спасиба ни дождёшься ни хотя-бы положительного отзыва
нужно больше хардкора!

0
20.02.2014, 20:08  [ТС]

Не по теме:

Цитата Сообщение от turbanoff Посмотреть сообщение
нужно больше хардкора!
ок учту замечание :)

0
20.02.2014, 20:10

Не по теме:

Цитата Сообщение от mutagen Посмотреть сообщение
нужно больше хардкора!
ок учту замечание
эээ, не забывайте про нас убогих :)

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.02.2014, 20:10
Помогаю со студенческими работами здесь

СМА Ardo FL85S срыв оборотов на отжиме
Доброго Вам ,форумчане!обычно все удается сделать,а тут напасть какаято! крыша уже от этой машины едет. чувствую если не сделаю ее, то она...

TRICKS: Странная имплементация
Если вдруг вы хотите насолить работодателю, партнёрам по команде, тестировщикам... Имплементируйте интерфейсы таким адским способом :) ...

TRICKS: Ковариантность и её вкус
В java есть возможность расширять возвращаемый тип метода типом наследником, что же можно из этого извлечь на практике: import...

TRICKS: Что вернёт метод?
начинаем серию постов TRICKS по фишкам JVM и компилятора, вопросы для самообразования, не более :) просьба не компилировать, а...

TRICKS: Хотите в java функцию на 1 раз?
подход с анонимом вам поможет слепить метод который не саффектит пространство имён вашего класса :p import java.util.HashSet; import...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru