From 26c7f1bd80dc9f089689fa10335cf2c2a2fd39a8 Mon Sep 17 00:00:00 2001 From: akwizgran <akwizgran@users.sourceforge.net> Date: Mon, 28 Nov 2011 15:12:13 +0000 Subject: [PATCH] Use CopyOnWriteArrayList for listener lists. --- .../sf/briar/db/DatabaseComponentImpl.java | 24 +++++-------------- components/net/sf/briar/i18n/I18nImpl.java | 19 ++++++--------- 2 files changed, 13 insertions(+), 30 deletions(-) diff --git a/components/net/sf/briar/db/DatabaseComponentImpl.java b/components/net/sf/briar/db/DatabaseComponentImpl.java index 34f177ec8b..90e9a5e659 100644 --- a/components/net/sf/briar/db/DatabaseComponentImpl.java +++ b/components/net/sf/briar/db/DatabaseComponentImpl.java @@ -13,8 +13,8 @@ import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; -import java.util.List; import java.util.Map; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.logging.Level; import java.util.logging.Logger; @@ -105,8 +105,8 @@ DatabaseCleaner.Callback { private final DatabaseCleaner cleaner; private final ShutdownManager shutdown; - private final List<DatabaseListener> listeners = - new ArrayList<DatabaseListener>(); // Locking: self + private final Collection<DatabaseListener> listeners = + new CopyOnWriteArrayList<DatabaseListener>(); private final Object spaceLock = new Object(); private long bytesStoredSinceLastCheck = 0L; // Locking: spaceLock @@ -161,15 +161,11 @@ DatabaseCleaner.Callback { } public void addListener(DatabaseListener d) { - synchronized(listeners) { - listeners.add(d); - } + listeners.add(d); } public void removeListener(DatabaseListener d) { - synchronized(listeners) { - listeners.remove(d); - } + listeners.remove(d); } public ContactId addContact(byte[] inSecret, byte[] outSecret) @@ -198,15 +194,7 @@ DatabaseCleaner.Callback { /** Notifies all listeners of a database event. */ private void callListeners(DatabaseEvent e) { - List<DatabaseListener> copy; - synchronized(listeners) { - if(listeners.isEmpty()) return; - copy = new ArrayList<DatabaseListener>(listeners); - } - // Shuffle the listeners so we don't always send new messages - // to contacts in the same order - Collections.shuffle(copy); - for(DatabaseListener d : copy) d.eventOccurred(e); + for(DatabaseListener d : listeners) d.eventOccurred(e); } public void addLocalGroupMessage(Message m) throws DbException { diff --git a/components/net/sf/briar/i18n/I18nImpl.java b/components/net/sf/briar/i18n/I18nImpl.java index 6bda4a2a13..bd1bbf5fff 100644 --- a/components/net/sf/briar/i18n/I18nImpl.java +++ b/components/net/sf/briar/i18n/I18nImpl.java @@ -6,12 +6,12 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; -import java.util.HashSet; +import java.util.Collection; import java.util.Locale; import java.util.MissingResourceException; import java.util.ResourceBundle; import java.util.Scanner; -import java.util.Set; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.logging.Level; import java.util.logging.Logger; @@ -77,7 +77,8 @@ public class I18nImpl implements I18n { private final Object bundleLock = new Object(); private final ClassLoader loader = I18n.class.getClassLoader(); - private final Set<Listener> listeners = new HashSet<Listener>(); + private final Collection<Listener> listeners = + new CopyOnWriteArrayList<Listener>(); private final FontManager fontManager; private volatile Locale locale = Locale.getDefault(); @@ -123,9 +124,7 @@ public class I18nImpl implements I18n { this.locale = locale; Locale.setDefault(locale); bundle = null; - synchronized(listeners) { - for(Listener l : listeners) l.localeChanged(uiFont); - } + for(Listener l : listeners) l.localeChanged(uiFont); } } @@ -157,14 +156,10 @@ public class I18nImpl implements I18n { public void addListener(Listener l) { l.localeChanged(fontManager.getUiFont()); - synchronized(listeners) { - listeners.add(l); - } + listeners.add(l); } public void removeListener(Listener l) { - synchronized(listeners) { - listeners.remove(l); - } + listeners.remove(l); } } -- GitLab