java 并发编程---goon

并发容器:

1:同步容器是将所有对容器状态的访问都串行化,以实现他们的线程安全性,这种方法的代价是严重降低并发性,当多个线程竞争容器的锁时,吞吐量将严重降低

并发容器是针对多线程并发访问设计的

2:concurrentHashMap://用来代替同步,且基于散列的HashMap

3:CopyOnWriteArrayList用于遍历操作为主要操作的情况下代替同步的List,

concurrentHashMap增加了一些常见的复合操作。若没有则添加,替换,以及有条件删除



queue和blockingQueue//队列

queue上的操作不会阻塞,如果队列为空那么获取那么获取元素的操作将返回空值,事实上正是通过linkedList来实现queue,但还需要一个queue类因为其能去掉linkedList的随机访问


blockQueue增加了阻塞的操作,如果队列为空那么获取元素的操作将阻塞,直到出现一个可用的元素,如果队列已满,那么插入操作将会阻塞直到队列中出现可用的空间,

生产者和消费者模式就是典型的使用场景。如果程序需要以独暂的形式访问map,则放弃使用concurrentHsashMap


copyOnWriteArrayList//用来代替List会有更好的性能,并且在迭代期间不需要对容器进行加锁和复制//写入时复制的大致原理是,在修改时都会创建并重新发布一个新的对象副本,从而实现可变性,容器的迭代器保留一个

指向底层基础数组的引用,这个数组当前位于迭代器的起始位置,由于它不会被修改,因此再对其进行同步时只需确保数组内容的可见性,//返回的元素与迭代器创建时的元素完全一致。

而不必考虑之后修改操作的带来的影响,重点 如过是修改操作较多,应避免使用copyonWriteArrayList

类似地:copyOnArraySet也是同样的功能



一种最常见的生产者与消费者模式 设计模式 就是线程池与工作队列   例如Executor框架   //队列一般是希望设置工作边界,这样可以有效的阻塞队列,防止内存耗尽

BlockingQueue 提供了两种队列:linkedBlockingQueue和ArrayBlockingQueue  都是FIFO两者与linkedList和ArrayList相视,同步状态下 比ArrayList具有更好的性能


priorityBlockingQueue  是一种具有按优先级队列的线程,也可以按照自然顺序排序,前提是实现Comparable方法,也可以使用Comparator来比较


synchronizedQueue:没有存储功能的队列,适合数据及时的交付 生产者-直接到-消费者----- 不需要中间的过渡盘


串行线程封闭:允许将一个线程里的对象安全地发布到另一个封闭的线程中,此时这个线程可以对该对象进行修改,前提是该线程对象必须是安全的,线程封闭对象只能由单个线程拥有

对象池启用了串行封闭线程,只要对象池能够保证包含足够的同步来发布池中的对象,并且客户代码不会发布池中的对象,或者将对象返回给对象池后就不再使用它。


双端队列与工作密取

Deque是一个双端队列---具体实现包括ArrayQueu和LinkBlockingQueu:可以实现在队列头和队列尾实现高效的插入和删除,

//每个消费者都有自己各自的队列,如果一个消费者完成了自己的队列,它可以从其它队列中秘密的获取工作,密取工作模式具有更搞的伸缩性,

原因:工作队列不会在单个共享的队列上发生竞争,每个线程都会运行各自独立的双端队列,访问另一个线程也是从队列尾部获取,这极大的减小了竞争。//非常适用于消费者与生产者模式



线程阻塞与恢复中端:线程可能会阻塞或执行而引起的这种操作的方式有多种,IO阻塞,socket读取,等待synchronized,等待Thread.sleep对于方法被阻塞,抛出InterruptedException

处理的方式,第一种:将方法抛出,返回给方法的调用者,

            第二种:try{}catch(Interrupted Exception){

Thread.currentThread.interrupted();//恢复被中断的状态,//这样在调用栈中更高层代码,将看到引发了一个中断

}

queue的take方法和put方法将会阻塞,也会抛出InterruptedException,总是既非空,也非满

同步工具类:根据自身的状态来协调线程的控制流 ,其自身包含一些特定的结构化属性,他们封装了一些状态,这些状态将决定执行在同步工具类的线程是继续执行,还是继续等待



闭锁:延迟线程的进度,指导其到达终止状态

1:就像是一道门初始状态大门一直是关闭的,在达到结束状态之前,这扇门将会打开,此时允许所有的线程通过,达到结束状态后将不会再改变,

作用:确保某些活动直到其它活动都执行完毕后再执行

 例如: 1确保某个计算在需要的资源被初始化之后再执行,此时叫做二元闭锁

 2:确保某个服务在其依赖的服务启动完成之后再启动

 

CountDownLatch//可以使一个或者多个线程等待一组事件发生。


转载于:https://my.oschina.net/u/876290/blog/372884

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值