1.executor、task、stream优先于线程
1.1 什么是executor?
Executor Framework是java平台一个包(java.util.concurrent)的内容.
它是一个很灵活的基于接口的任务执行工具。而使用executor框架,能有效建立线程池,由线程池集中管理线程,以实现线程的降耗提速。
在我学习的java思想编程的时候,已经详细记录过笔记了:
https://blog.csdn.net/asdfghj253/article/details/104050967
1.2 Runnable和Thread的差别
Thread方面:它既充当工作单元,又是执行机制
Runnable方面:是只有工作单元的,其称之为task(任务),(PS:有返回值的工作单元叫Callable),task(任务)的执行机制是executor。
2.并发工具优先于wait和notify
目前来讲,java提供了更高级并发工具来代替wait()和notify()所进行的工作。
java.util.concurrent的三类.:Executor Framework、并发集合(Concurrent Collection)、同步器(Synchronizer)
这里说明一下,并发集合实质上就是java编程思想里面的免锁容器,两个是一样的。它不需要加锁,这样只会使性能更慢。
https://blog.csdn.net/asdfghj253/article/details/104800159
并发集合:
ConcurrentHashMap:线程安全的HashMap的实现
CopyOnWriteArrayList:线程安全且在读操作时无锁的ArrayList
CopyOnWriteArraySet:基于CopyOnWriteArrayList,不添加重复元素ArrayBlockingQueue:基于数组、先进先出、线程安全,可实现指定时间的阻塞读写,并且容量可以限制
LinkedBlockingQueue:基于链表实现,读写各用一把锁,在高并发读写操作都多的情况下,性能优于ArrayBlockingQueue
而同步器也是之前有讲到过的
https://blog.csdn.net/asdfghj253/article/details/104747009
同步器:
1.CountDownLatch:通过计数器控制线程,归0执行
2.Semaphore :允许n个任务同时访问同一项资源。
3.CycliBarrier:与CountDownLatch类似,可多次执行的。
4.Exchanger.:交换线程间数据。
当然是优先使用并发工具,但有时还是会遇到使用wait()和notify()的时候。这时需要注意的是:
1.wait()方法必须确保放在同步区域的while块里面,避免出现问题。
2.notify()和wait()前后顺序也必须理清,防止进入永远等待的状态。
3.线程安全性的文档化
关于这一节,主要说明的是关于一个类对于被多线程使用的安全等级,这里书中提供了5个等级:
1.不可变的:这个类的实例是不变的,无需外部的同步。(例:String、Long、BigInteger)
2.无条件的线程安全:这个类的实例是可变的,但这个类有足够的内部同步,所以无需外部同步(例:AtomicLong、ConcurrentHashMap)
3.有条件的线程安全:基本和无条件的线程安全类似,但是部分需要外部同步。(例:Synchronized返回的集合,其迭代器需要外部同步)
4.非线程安全:这个类的实例是可变的,为并发使用需用外部同步来包围方法调用。(例:Arraylist和HashMap)
5.线程队里的:这个类不能安全地被多个线程并发使用,所有方法都需要外部同步(例:没有同步修改数据)
以上五个安全等级可用于文档中对于实际编写的类和多线程关系的描述。
更详细点还可以描述,具体使用哪把锁,调用什么方法。
除此之外,Lock域应该始终声明为final,这样保证了lock域的可变性缩到最小,保证线程安全