Javaの容器のスレッドは安全です。
1191 ワード
http://blog.sina.com.cn/s/blog_5 efa 34730 10129 pw.
スレッド安全:複数のスレッドが容器を操作する場合、お互いの間に思いがけない影響を与えない。
一部の容器はスレッドの安全(Vector、ConcerentlinkedQueなど)であり、一部は(listなど)ではなく、prvate static List(Task)のようなtaskue=Collections.snchronized List(new LinkdList<Task>)を利用している。この方法は、自身がスレッドの安全ではない容易なスレッドセキュリティの状態を得ることができるが、スレッドセキュリティとは、単にそれが提供する関数を直接使用するということであり、例えば:queue.add(obj); または queue.poll(obj)このように、私達自身は同期をする必要がありません。原子以外の操作であれば、例えば: 1. if(!queue.isEmpty() { 2. queue.poll(obj) 3. } 私たちはisEmpty()を呼び出した後、poll()の前に、このqueueが他のスレッドに修正されていないことを保証するのは難しいです。ですから、この場合は自分で同期する必要があります。 1. synchronized(queue) { 2. if(!queue.isEmpty() { 3. queue.poll(obj) 4. } 5. } Collection s.synchronized List(new Linked List<Task>())に対して、
戻ってきたリストで反復する場合、ユーザーは戻りのリストに手動で同期しなければなりません。
これを守らないと、確定できない行為になります。
スレッド安全:複数のスレッドが容器を操作する場合、お互いの間に思いがけない影響を与えない。
一部の容器はスレッドの安全(Vector、ConcerentlinkedQueなど)であり、一部は(listなど)ではなく、prvate static List(Task)のようなtaskue=Collections.snchronized List(new LinkdList<Task>)を利用している。この方法は、自身がスレッドの安全ではない容易なスレッドセキュリティの状態を得ることができるが、スレッドセキュリティとは、単にそれが提供する関数を直接使用するということであり、例えば:queue.add(obj); または queue.poll(obj)このように、私達自身は同期をする必要がありません。原子以外の操作であれば、例えば: 1. if(!queue.isEmpty() { 2. queue.poll(obj) 3. } 私たちはisEmpty()を呼び出した後、poll()の前に、このqueueが他のスレッドに修正されていないことを保証するのは難しいです。ですから、この場合は自分で同期する必要があります。 1. synchronized(queue) { 2. if(!queue.isEmpty() { 3. queue.poll(obj) 4. } 5. } Collection s.synchronized List(new Linked List<Task>())に対して、
戻ってきたリストで反復する場合、ユーザーは戻りのリストに手動で同期しなければなりません。
List list = Collections.synchronizedList(new ArrayList()); ... synchronized(list) { Iterator i = list.iterator(); // Must be in synchronized block while (i.hasNext()) foo(i.next()); }
これを守らないと、確定できない行為になります。