<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 ;}@Overridepublic 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 ); //3q . add ( t2 ); //4q . add ( t3 ); //1// 1 3 4System . 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.DelayQueuepublic 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后出队列。