线程安全: 多个线程在操作共享的资源,比如说我们的容器的时候。互相之间会带来意想
不到的的影响。
在jdk之中,有一些容器是线程安全的,有一些容器则不是。利用如下的方法:
private satic List<Task> taskQueue = Collections.SynchronizedList(new LinkedList<Task>()); 的方法,可以得到
本身状态不是线程安全的容器的线程安全的状态,当是要注意,如果我们紧紧只是在使用原子类型的操作
比如 : queue.poll(obj); 那么我们在Conllections.SynchronziedList方法中调用后,poll将处于同步状态。对于lingwai的
一些操作:非同步类的操作,好比如下。
if(! queue.isEmpty())
{
queue.poll(obj);
}
在这里我们很难保证,在调用了isEmpty()以后,在poll之间,这个queue队列有没有别修改
,所以对于这种情况,我们还是需要自己去同步
synchronized(queue) {
if(!queue.isEmpty()) {
queue.poll(obj);
}
}
对于Collections.synchronizedList(new LinkedList<Task>()),
在返回的列表上进行迭代时,用户必须手工在返回的列表上进行同步:
List list = Collections.synchronizedList(new ArrayList());
... synchronized(list)
{ Iterator i = list.iterator();
// Must be in synchronized block while (i.hasNext()) foo(i.next()); }
不遵从此建议将导致无法确定的行为。这里针对的是iterator;