互斥锁synchronized,锁定对象,this对象,不是方法区块
synchronized static 等同于synchronized当前对象类.class,static可以直接访问,所以不存在this对象
第一种lambda表达式,第二种要jdk8,后面是最古老的写法,new出来一个线程
synchronized获得的锁是可重入的,就是说当前线程已经获得一个synchronized锁,在里面又去获取当前对象的锁,是允许的
子类的synchronized同步方法调用父类的同步方法,锁定的都是当前子类对象锁,不会出现死锁问题
死锁,循环死锁,例子,当前线程锁定A的同时取对象锁B的时候被另一个线程锁住,线程卡住暂停执行,另一个线程锁住B的同时去获取A对象锁,就会造成死锁
程序在运行时出现异常,默认锁会被释放,多线程处理过程中一定要小心处理异常,不然有可能会出现不一致问题
volatile关键字
通知其他线程,线程内存里的缓存值已经过期失效,需要他们重新去主内存刷新当前缓存值。
保证两个线程之间变量的可见性。不保证原子性。
synchronized保证原子性跟可见性
Atomic***类是java提供的具备原子性的简单算法操作,如AtomicInteger
自行理解,就是在两句话中间还是会存在线程插入导致atomic类不具备原子性
synchronized肯定是代码块越少,粒度越细程序执行效率更快更高。
避免synchronized锁定的对象发生改变,一旦对象锁改变,对象锁是存在堆内存里的,如果改变换成新的new object(),锁会被释放,其他线程会进去,说明了前面说的对象锁是在堆内存里的。
不要使用字符串常量作为锁定对象,避免,以免会出现跟类库出现死锁现象
wait,notify方法,锁定当前对象,
wait:线程进入等待状态;wait会释放锁
notify:唤醒某个线程,不会释放锁资源,继续执行
notifyAll:所有
sleep不释放锁
semaphore
CountdownLatch 门栓,
countDown:new出来的时候是1,调用countDown从1变成0,门就打开了
await:锁门,等待
Lock lock = new ReentrantLock();必须手动释放锁,try,catch,finally释放锁
lock,unlock方法
tryLock方法
lock.lockInterruptibly():响应打断方法,其他线程可以通过前面的方法调用interrupt打断线程
interrupt
synchronized默认为不公平锁。reebtrantlock可以指定公平锁
Condition Lock
ThreadLocal 线程局部变量
ConcurrentHashMap
ConcurrentSkipListMap高并发并且排序
CopyOnWriteArrayList 写时复制 适合写少读多的环境。如事件监听器
Quene
strs.offer = add poll:从头部取出,同时删掉 peek:从头部取出但是不删除
concurrentLinkedQuene
BlockingQuene阻塞式队列 put:如果满了就会等待; take:如果空了就会等待
LinkedBlockingQuene无界队列
ArrayBlockingQuene有界队列
DelayQuene执行定时任务
LinkedTransferQuene transfer方法会阻塞,实时消息处理。传进消息就必须要处理,不然会阻塞
SynchronousQuene容量为0的队列,不能使用add,只能使用put,阻塞等待消费者消费
双端队列Duene
线程池的几个接口
Executor:执行器的意思,只包含一个方法,execute()
ExecutorService接口 execute,submit方法执行任务等
需要返回值时用Callable,不需要用Runnable
Executors:工厂方法
线程池的概念:一堆线程装在某个容器里等待运行。
ThreadPool
ExecutorService service = Executors.newFixedThreadPool(5);
Future拿到未来的某个返回值 FutureTask
并行计算
ExecutorService service = Executors.newCachedThreadPool();
看空间进程,执行任务时没有空闲进程就新建,弹性的,默认超过60秒空闲就shutdown线程
newSingleThreadPool:单线程的,保证顺序执行线程任务
ScheduledExecutorService:可重用的 定时任务
1:任务 2:第一个任务延迟时间 3:每隔多少时间执行,4:时间单位
WorkStealingPool :工作窃取,线程主动找活干
ForkJoinPool:分叉合并,即碎片化任务加快执行速度,然后在合并执行结果
递归任务:
RecursiveAction:没有返回值
RecursiveTask 有返回值
自定义线程池 new ThreadPoolEcecutor
parallelStream