Skip to content

Commit 0a21505

Browse files
committed
Make unsynchronized traversal safe for Listeners.SynchronizedList
1 parent 1a2f346 commit 0a21505

File tree

1 file changed

+13
-4
lines changed

1 file changed

+13
-4
lines changed

src/main/java/org/scijava/listeners/Listeners.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.util.ArrayList;
44
import java.util.Collection;
5+
import java.util.concurrent.CopyOnWriteArrayList;
56
import java.util.function.Consumer;
67

78
/**
@@ -68,15 +69,21 @@ class List< T > implements Listeners< T >
6869

6970
public List( final Consumer< T > onAdd )
7071
{
71-
this.onAdd = onAdd;
72+
this( onAdd, new ArrayList< T >() );
7273
}
7374

7475
public List()
7576
{
7677
this( o -> {} );
7778
}
7879

79-
public final ArrayList< T > list = new ArrayList<>();
80+
public final java.util.List< T > list;
81+
82+
protected List( final Consumer< T > onAdd, final java.util.List< T > list )
83+
{
84+
this.onAdd = onAdd;
85+
this.list = list;
86+
}
8087

8188
@Override
8289
public boolean add( final T listener )
@@ -122,17 +129,19 @@ static int clamp( int value, int min, int max )
122129
/**
123130
* Extends {@link Listeners.List}, making {@code add} and {@code remove}
124131
* methods synchronized.
132+
* <p>
133+
* The list is maintained as a {@link CopyOnWriteArrayList} to allow unsynchronized traversal.
125134
*/
126135
class SynchronizedList< T > extends List< T >
127136
{
128137
public SynchronizedList( final Consumer< T > onAdd )
129138
{
130-
super( onAdd );
139+
super( onAdd, new CopyOnWriteArrayList<>() );
131140
}
132141

133142
public SynchronizedList()
134143
{
135-
super();
144+
super( o -> {}, new CopyOnWriteArrayList<>() );
136145
}
137146

138147
@Override

0 commit comments

Comments
 (0)