Collections.synchronizedList 工厂方法

通常的Map,Set,List实现都不是线程安全的,通过这些工厂方法可以得到相应的同步容器,相当于增强了访问控制,把一个链表对象传递过来后,我们都通过返回的这个链表对象来进行各种操作(都是同步方法),而不再操纵底层的那个链表。此外,在Vector和同步封装器类中是用内置锁来来支持客户端加锁,所以我们可以进行扩展。

在对对链表迭代的过程中也要注意加锁,否则在迭代的过程中,如果其他某个线程改变了容器的属性,next,hasNext方法就会抛出ConcurrentModificationException
异常(而诸如ConcurrentHashMap的并发容器不需要迭代过程加锁)。更重要的是,要防止隐藏迭代,如果对某个容器调用toString方法的时候。下面是对应的代码。

1.迭代的时候要同步。

List<Integer> safeList = Collections. synchronizedListnew ArrayList<Integer>());

synchronized (safeList)
{

Iterator<Integer> i = safeList.iterator(); // Must be in synchronized block

while (i.hasNext())

System. out.println(i.next());

}

2.隐藏迭代器。

public class HiddenIterator
{

private final Set<Integer> set = new HashSet<Integer>();

public synchronized void add(Integer
i) {

set.add(i);

}

public synchronized void remove(Integer
i) {

set.remove(i);

}

public void addTenThings()
{

Random r = new Random();

for ( int i
= 0; i < 10; i++)

add(r.nextInt());

System. out.println( "DEBUG:
added ten elements to " + set); //这里

}

}

2.容器中toString方法的实现。

public String toString() {

Iterator<E> it = iterator();

if (!
it.hasNext())

return "[]";

StringBuilder sb = new StringBuilder();

sb.append( ‘[‘);

for (;;)
{

E e = it.next();

sb.append(e == this ? "(this
Collection)" : e);

if (!
it.hasNext())

return sb.append( ‘]‘).toString();

sb.append( ‘,‘).append( ‘
‘);

}

}

时间: 2024-11-05 14:52:17

Collections.synchronizedList 工厂方法的相关文章

【集合类型的并发】Collections.synchronizedList

摘要: 详细的解析:Collections.synchronizedList 1 :关注要点,为什么在有synchroniezed方法的同时会出现 Collections.synchronizedList 2 :知识背景: 您可能需要了解java Synchronized方法的加锁的各种机制,包括如何上锁,锁对象 3 : plus: 您需要不断的深化 Java加锁的各种机制 @NotThreadSafe class BadListHelper <E> { public List<E>

设计模式学习第四天:2.3工厂方法模式以及演化

一. 工厂方法(Factory Method)模式      工厂方法(FactoryMethod)模式是类的创建模式,其用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中.      工厂方法模式是简单工厂模式的进一步抽象和推广.由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点.      在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做.这个核心类仅仅负责给出具体工厂必须实现的接口,而不接触哪一个产品类被实例化这种细

CopyOnWriteArrayList与Collections.synchronizedList的性能对比

列表实现有ArrayList.Vector.CopyOnWriteArrayList.Collections.synchronizedList(list)四种方式. 1 ArrayList ArrayList是非线性安全,此类的 iterator 和 listIterator 方法返回的迭代器是快速失败的:在创建迭代器之后,除非通过迭代器自身的 remove 或 add 方法从结构上对列表进行修改,否则在任何时间以任何方式对列表进行修改,迭代器都会抛出 ConcurrentModificatio

设计模式 之 简单工厂与工厂方法

    最近开始学习<大话设计模式>,作者以通俗的方式来讲解,还有故事情节,幽默的对白,给人耳目一新的感觉.非常喜欢作者的这种步步深入,循循善诱的方式.学习了就要总结,总结的时候自己也学着作者的方式,以自己生活中的小例子来实现我们的设计模式.下面就开始我们的第一讲<简单工厂和工厂方法>.     前两天带着一个老乡去吃饭,当然,作为一个四川人,去外边吃饭当然是点我们著名的川菜!下面先用简单工厂来实现一下: using System; using System.Collections

简单工厂、工厂方法与抽象工厂大比拼

简单工厂.工厂方法和抽象工厂都属于设计模式创建型,严格意义上简单工厂不属于23设计模式之一(违背了开闭原则),本文为了完整描述三工厂演变过程,对三工厂进行了整体的总结和学习,并通过三者之间的特点比较总结出各自的优缺点. 一.简单工厂: 在没有工厂之前,大家都是自给自足,生产一部车或其他工具都是自己来完成,有了工厂之后,告诉它需求就会出来相应的产品,但生产化水平比较低,工厂分工不太明确,社会上只有一个工厂,不论卡车还是公交车都由它来完成,相当于一个工厂多条生产线. 类图: 代码: /*******

【浅析】静态工厂方法

第一次看到这个名词是在Effective的第一条中,书中先是数落了一番构造器之后提出静态工厂方法的好处如何如何.看完后觉得,虽然这个名词之前没听过,其实在开发途中用的不少,入类型转换valueOf(),单例模式中的getInstance()均有静态工厂模式的痕迹.首先是不太认可书中所说的好处,于是上网寻找资料.总结如下: 一.什么是静态工厂方法 其又叫简单工厂模式,与工厂模式不同,其是通过专门定义一个类来负责创建其他类的实例,其实例通常拥有共同父类,其普遍实现主要依靠Java的反射机制. 二.好

Collections集合类使用方法

1. package com.fish.util; import java.util.ArrayList; import java.util.Collections; /*  集合的工具类(Collections)  说出Collection与Collections的区别?  1. Collection是一个单例集合的根接口,Collections是操作对象的一个工具类.    Collections:常见方法:    1,对list进行二分查找:前提该集合一定要有序.  int binaryS

静态工厂方法VS构造器

我之前已经介绍过关于构建者模式(Builder Pattern)的一些内容,它是一种很有用的模式用于实例化包含几个属性(可选的)的类,带来的好处是更容易读.写及维护客户端代码.今天,我将继续介绍对象创建技术. 在我看来,下面这个类是非常有用的例子.有一个RandomIntGenerator 类,产生随机的int类型的整数.如下所示: public class RandomIntGenerator { private final int min; private final int max; pu

数据库实现,以及工厂方法模式实现

计算类的定义 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SQL { interface operater1 { int calculate(int a, int b); } class Add : operater1 { public int calculate(int a, int b) { return a + b; } } class Sub