Executor :线程池

CatchedThreadPool:创建与所需数量相同的线程,在回收旧线程是停止创建新县城。

FixedThreadPool:创建一定数量的线程,所有任务公用这些线程。

SingleThreadPool:线程数量为1的FixedThreadPool,并且执行有序。

如果需要得到线程返回值,要实现Callbale接口,submit方法执行,call方法返回返回值。

方法:

yield():你已经执行差不都了,把cpu让出来给其他线程去用

setDaemon():设置为后台线程,尽量不要用,关闭不好控制。

 

Java中递增不是原子性操作,不安全

synchronized:

同一个对象多个synchronized方法共享一个锁,

一个任务可以获得多次对象锁,即一个synchronized方法调用给另一个synchronized方法,这时锁的次数是递增的。

synchronized针对每个类也有一个锁

 

原子性 、可视性 都是针对多任务,如果是一个任务则不需要

volatile 保证原子性、可视性

 volatile 每次修改都会把结果写入主存,而读取都是读主存,保证可视性

synchronized可以完全实现volatile 功能,最好使用synchronized

 

sleep 当前线程放弃CPU,开始睡眠,在睡眠中不会释放锁。

yield 当前线程放弃CPU,但不会释放锁,放弃cpu多久不知道。

wait 这个线程会释放锁,进行对象的等待池。