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也能保证可见性