博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
并发编程知识点记录
阅读量:5794 次
发布时间:2019-06-18

本文共 2441 字,大约阅读时间需要 8 分钟。

1.使用ThreadLocal最好是用final修饰(或者volatile),因为有可能被多线程访问,要多线程保证可见性

2.InheritableThreadLocal能够将一个线程中的值传递给子线程,在父线程中设置set,然后子线程中get可以取到
3.线程池使用完毕了之后要记得关闭,否则程序是不会退出的。
4.CountDownLatch既可以使多线程等待主线程信号,也能让主线程等待多个子线程完成的信号
5.CyclicBarrier是一个让多线程之间相互等待的类,循环的屏障。意思是让一组线程到达某个屏障点的时候要等待,然后等最后一条线程到达此屏障点之后,所有线程再继续往下执行.它和CountDownLatch还是有区别的,它是到了屏障点之后继续做自己的事情,而CountDownLatch则是一个控制器(计数控制器),比如做一个开关,多个子线程等待,主线程达到某个条件之后,做一个countDown方法让子线程开始执行。而CyclicBarrier则类似是让执行中的线程都先达到某个状态后,才开始继续做接下来的事情,每个线程调用cb的await方法
    表示到达了屏障点。CountDownLatch只能使用一次,而CyclicBarrier可以通过reset方法重置在此计数器上的数值。CountDownLatch是递减,CyclicBarrier是递增
6.Exchanger是一个让两个线程之间相互交换对象的类。它的exchange(xxx)方法能够阻塞,直到两个线程都调用此方法他才会返回另外一个线程的内容
7.信号量Semaphore是对一个资源进行访问限制的同步器,常用方法有acquire获取一个许可,release释放一个许可,drainPermits会获取当前还剩多少个许可并且返回这个个数
8.Phaser是一个更加弹性的同步屏障,功能上和CountDownLatch和CyclicBarrier类似。它的arrive()方法类似于countdown(),phaser.awaitAdvance(phaser.getPhase())则类似于await()
,arriveAndAwaitAdvance()方法则类似于CyclicBarrier的await()方法,如果想实现类似于CyclicBarrier的action,那么只需要重写Phaser的onAdvance方法即可。另外,Phaser的register
方法也是可以占用添加一个未抵达的线程,如果抵达了,调用arriveAndDeregister这个方法可以标识,并且还可以重置当前Phaser的处理屏障点线程个数
9.java中synchronized和ReentrantLock都是可重入锁(内层代码能够再次获取外层代码的锁),都是互斥锁
10.ReentrantReadWriteLock在没有任何读锁时才会获取写锁,所以如果针对的是读多写少的场景下,那么读操作会一直获取锁,导致写操作线程遇到饥饿问题,可以使用java8中的
    StampedLock处理
11.BlockingQueue的put()和take()都是阻塞方法
12.ConcurrentHashmap的putIfAbsent方法是当一个map中不存在这样的key,才插入,返回null,插入不成功则返回之前的值,在jdk1.8中增加很多方法
13.Random生成随机数不是线程安全的,因为它是基于时间来作为种子来生成随机数的,多核的cpu下可能会存在同一时刻生成的随机数,所以建议使用ThreadLocalRandom
14.原子变量能够保证每一次操作都具有原子性,在jdk1.8中,新增了DoubleAdder、DoubleAccumulate、LongAdder、LongAccumulate方法提高性能(多线程竞争:线程之间切换昂贵,
        如果使用互斥及可见,那么吞吐量有问题,所以不建议使用传统的互斥锁)
15.CopyOnWriteArrayList/CopyOnWriteArraySet可以处理迭代集合的时候更新集合操作,但是性能比较差,原因是在更新集合的时候他要进行复制,所以不适合多更新的操作
16.CompletionService与ExecutorService最主要的区别在于前者submit的task不一定是按照加入时的顺序完成的。CompletionService对ExecutorService进行了包装, 
    内部维护一个保存Future对象的BlockingQueue。只有当这个Future对象状态是结束的时候,才会加入到这个Queue中,take()方法其实就是Producer-Consumer中的Consumer。
    它会从Queue中取出Future对象,如果Queue是空的,就会阻塞在那里,直到有完成的Future对象加入到Queue中。所以,先完成的必定先被取出。这样就减少了不必要的等待时间。
    这针对的是多任务提交返回List结果集合

Socket 是对 TCP/IP 协议的封装,Socket 只是个接口不是协议,通过 Socket 我们才能使用 TCP/IP 协议,除了 TCP,也可以使用 UDP 协议来传递数据。

创建 Socket 连接的时候,可以指定传输层协议,可以是 TCP 或者 UDP,当用 TCP 连接,该Socket就是个TCP连接,反之。

在java中:/s表示空格、/t表示制表符、/n表示换行,在Windows下,/r/n表示换行(/r表示回车)

final类型修饰的变量初始化完成之后是不允许修改的,但是使用native代码可以修改(JNI)

java 中除了volatile可以保证可见性之外,final、synchronized也能保证可见性

转载于:https://my.oschina.net/whling/blog/1634858

你可能感兴趣的文章
数据解码互联网行业职位
查看>>
我所见的讲的最容易理解,逻辑最强的五层网络模型,来自大神阮一峰
查看>>
js实现复选框的操作-------Day41
查看>>
数据结构化与保存
查看>>
chrome浏览器开发者工具之同步修改至本地
查看>>
debian7 + wheezy + chromium + flashplayer
查看>>
AOP
查看>>
进阶开发——文档,缓存,ip限速
查看>>
vue中子组件需调用父组件通过异步获取的数据
查看>>
uva 11468 - Substring(AC自己主动机+概率)
查看>>
Mysql 数据备份与恢复,用户创建,授权
查看>>
沉思录
查看>>
Angular.js中的$injector服务
查看>>
构建之法读书笔记01
查看>>
linux - lsof 命令最佳实践
查看>>
kafka性能测试
查看>>
现实世界的Windows Azure:h.e.t软件使用Windows Azure削减50%的成本
查看>>
深入.net框架
查看>>
聚合类新闻client产品功能点详情分析
查看>>
js设置定时器
查看>>