java并发编程容器

<span style="font-size:24px;"><strong>1.ConcurrentHashMap</strong></span>

虽然hashtable线程安全,但是多线程访问 时同一时间只能有一个线程访问,效率不高,ConcurrentHashMap引入了一个“分段锁”的概念,具体可以理解为把一个大的Map拆分成N个小的HashTable,根据key.hashCode()来决定把key放到哪个HashTable中。把Map分成了16个Segment,put和get的时候,都是现根据key.hashCode()算出放到哪个Segment中。

2.CopyOnWrite

读写分离,写数据时在内存中复制一份容器的引用,读的时候读取原来的那份容器,写完成之后将原来的引用指向写完的拷贝出的那个容器。适合读多写少的情况。

3.PriorityBlockingQueue

 
 
public class Task implements Comparable < Task >{
private int id ;
private String name ;
public int getId () {
return id ;
}
public void setId ( int id ) {
this . id = id ;
}
public String getName () {
return name ;
}
public void setName ( String name ) {
this . name = name ;
}
@Override
public int compareTo ( Task task ) {
return this . id > task . id ? 1 : ( this . id < task . id ? - 1 : 0 );
}
public String toString (){
return this . id + "," + this . name ;
}
}
   
   
public class UsePriorityBlockingQueue {

public static void main ( String [] args ) throws Exception {
PriorityBlockingQueue < Task > q = new PriorityBlockingQueue < Task >();
Task t1 = new Task ();
t1 . setId ( 3 );
t1 . setName ( "id为3" );
Task t2 = new Task ();
t2 . setId ( 4 );
t2 . setName ( "id为4" );
Task t3 = new Task ();
t3 . setId ( 1 );
t3 . setName ( "id为1" );
//return this.id > task.id ? 1 : 0;
q . add ( t1 ); //3
q . add ( t2 ); //4
q . add ( t3 ); //1
// 1 3 4
System . out . println ( "容器:" + q );
System . out . println ( q . take (). getId ());
System . out . println ( "容器:" + q );
// System.out.println(q.take().getId());
// System.out.println(q.take().getId());
}
}
Task类需要重写CompareTo方法,PriorityBlockingQueue在使用take方法后会把最小的那个元素放在队列首。
4.DelayQueue
public class WangBa implements Runnable {            private DelayQueue<Wangmin> queue = new DelayQueue<Wangmin>();            public boolean yinye =true;              public void shangji(String name,String id,int money){           Wangmin man = new Wangmin(name, id, 1000 * money + System.currentTimeMillis());           System.out.println("网名"+man.getName()+" 身份证"+man.getId()+"交钱"+money+"块,开始上机...");           this.queue.add(man);       }              public void xiaji(Wangmin man){           System.out.println("网名"+man.getName()+" 身份证"+man.getId()+"时间到下机...");       }          @Override       public void run() {           while(yinye){               try {                   Wangmin man = queue.take();                   xiaji(man);               } catch (InterruptedException e) {                   e.printStackTrace();               }           }       }              public static void main(String args[]){           try{               System.out.println("网吧开始营业");               WangBa siyu = new WangBa();               Thread shangwang = new Thread(siyu);               shangwang.start();                              siyu.shangji("路人甲", "123", 1);               siyu.shangji("路人乙", "234", 10);               siyu.shangji("路人丙", "345", 5);           }           catch(Exception e){               e.printStackTrace();         }          }   }  
public class Wangmin implements Delayed {            private String name;       //身份证       private String id;       //截止时间       private long endTime;       //定义时间工具类     private TimeUnit timeUnit = TimeUnit.SECONDS;            public Wangmin(String name,String id,long endTime){           this.name=name;           this.id=id;           this.endTime = endTime;       }              public String getName(){           return this.name;       }              public String getId(){           return this.id;       }              /**       * 用来判断是否到了截止时间       */       @Override       public long getDelay(TimeUnit unit) {          //return unit.convert(endTime, TimeUnit.MILLISECONDS) - unit.convert(System.currentTimeMillis(), TimeUnit.MILLISECONDS);     return endTime - System.currentTimeMillis();     }          /**       * 相互批较排序用       */       @Override       public int compareTo(Delayed delayed) {       Wangmin w = (Wangmin)delayed;           return this.getDelay(this.timeUnit) - w.getDelay(this.timeUnit) > 0 ? 1:0;       }   }  
根据compareTo方法在延迟时间长度排序后依次在take后出队列。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值