互斥锁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     


相关文章:

  • 2022-12-23
  • 2022-02-04
  • 2021-11-22
  • 2021-08-26
  • 2021-10-11
  • 2021-10-01
  • 2022-12-23
猜你喜欢
  • 2022-02-20
  • 2021-11-21
  • 2022-12-23
  • 2022-12-23
  • 2021-12-22
相关资源
相似解决方案