JDK中Collections的线程安全怎么实现
创始人
2024-12-25 23:02:12
0次

方法:

  1.   public static  Set synchronizedSet(Set s) {

  2.     return new SynchronizedSet(s);

  3.     }

  1.  static class SynchronizedSet

  2.       extends SynchronizedCollection

  3.       implements Set {

  4.     private static final long serialVersionUID = 487447009682186044L;


  5.     SynchronizedSet(Set s) {

  6.             super(s);

  7.         }

  8.     SynchronizedSet(Set s, Object mutex) {

  9.             super(s, mutex);

  10.         }


  11.     public boolean equals(Object o) {

  12.         synchronized(mutex) {return c.equals(o);}

  13.         }

  14.     public int hashCode() {

  15.         synchronized(mutex) {return c.hashCode();}

  16.         }

  17.     }


  1.     // use serialVersionUID from JDK 1.2.2 for interoperability

  2.     private static final long serialVersionUID = 3053995032091335093L;


  3.     final Collection c;  // Backing Collection

  4.     final Object mutex;     // Object on which to synchronize


  5.     SynchronizedCollection(Collection c) {

  6.             if (c==null)

  7.                 throw new NullPointerException();

  8.         this.c = c;

  9.             mutex = this;

  10.         }

  11.     SynchronizedCollection(Collection c, Object mutex) {

  12.         this.c = c;

  13.             this.mutex = mutex;

  14.         }


  15.     public int size() {

  16.         synchronized(mutex) {return c.size();}

  17.         }

  18.     public boolean isEmpty() {

  19.         synchronized(mutex) {return c.isEmpty();}

  20.         }

  21.     public boolean contains(Object o) {

  22.         synchronized(mutex) {return c.contains(o);}

  23.         }

  24.     public Object[] toArray() {

  25.         synchronized(mutex) {return c.toArray();}

  26.         }

  27.     public  T[] toArray(T[] a) {

  28.         synchronized(mutex) {return c.toArray(a);}

  29.         }


  30.     public Iterator iterator() {

  31.             return c.iterator(); // Must be manually synched by user!

  32.         }


  33.     public boolean add(E e) {

  34.         synchronized(mutex) {return c.add(e);}

  35.         }

  36.     public boolean remove(Object o) {

  37.         synchronized(mutex) {return c.remove(o);}

  38.         }


  39.     public boolean containsAll(Collection coll) {

  40.         synchronized(mutex) {return c.containsAll(coll);}

  41.         }

  42.     public boolean addAll(Collection coll) {

  43.         synchronized(mutex) {return c.addAll(coll);}

  44.         }

  45.     public boolean removeAll(Collection coll) {

  46.         synchronized(mutex) {return c.removeAll(coll);}

  47.         }

  48.     public boolean retainAll(Collection coll) {

  49.         synchronized(mutex) {return c.retainAll(coll);}

  50.         }

  51.     public void clear() {

  52.         synchronized(mutex) {c.clear();}

  53.         }

  54.     public String toString() {

  55.         synchronized(mutex) {return c.toString();}

  56.         }

  57.         private void writeObject(ObjectOutputStream s) throws IOException {

  58.         synchronized(mutex) {s.defaultWriteObject();}

  59.         }

  60.     }

List和Map方法同理,这样,我们利用了装实模式,给我们的Map和List穿上了交通协管员的制服,减少了类爆炸,这就是装实模式;

  1. package org;


  2. public class AImp implements IA {


  3.     public synchronized void say() {

  4.         ;

  5.     }


  6. }


  1. package org;


  2. public interface IA {

  3.  public void say();

  4. }


sychronized标识符是不影响接口的实现和继承的

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...