- CAS:首先CPU将内存中的将要被修改的数据与预期的值进行比较,如果这两个值相等,CPU则会将内存中数值替换为新值,否则不做操作。
-
Synchronized原理:
Synchronized实现原理 _EntryList、Owner、_WaitSet【1】:进入获取锁的线程、指向持有Monitor对象的线程、等待获取锁的线程
tip1【2】:对象的内存布局:对象头,实例数据,对齐填充(对齐填充并不是必然存在的,仅仅起着占位符的作用,保证对象头部分正好是8字节的倍数。)
偏向锁【3】:无实际竞争,且将来只有第一个申请锁的线程会使用锁。
轻量级锁【3】:无实际竞争,多个线程交替使用锁;允许短时间的锁竞争。
重量级锁:的加锁、解锁过程和轻量级锁差不多,区别是:竞争失败后,线程阻塞,释放锁后,唤醒阻塞的线程
- AQS【4】:AbustactQueuedSynchronizer的简称,它是一个Java提高的底层同步工具类,用一个int类型的变量表示同步状态,并提供了一系列的CAS操作来管理这个同步状态。
同步队列是AQS很重要的组成部分,它是一个双端队列,遵循FIFO原则,主要作用是用来存放在锁上阻塞的线程,当一个线程尝试获取锁时,如果已经被占用,那么当前线程就会被构造成一个Node节点假如到同步队列的尾部,队列的头节点是成功获取锁的节点,当头节点线程是否锁时,会唤醒后面的节点并释放当前头节点的引用。
独占锁和共享锁:独占锁的同步状态值为1,即同一时刻只能有一个线程成功获取同步状态;共享锁的同步状态>1,取值由上层同步组件确定。
重入锁:基本原理是判断上次获取锁的线程是否为当前线程,如果是则可再次进入临界区,如果不是,则阻塞。
- LongAccumulator:LongAccumulator相比于LongAdder可以提供累加器初始非0值,后者只能默认为0,另外前者还可以指定累加规则比如不是累加而是相乘,只需要构造LongAccumulator时候传入自定义双面运算器就OK,后者则内置累加的规则。
- blockqueue:线程共享通道,当有新的消息进入队列后,自动将线程唤醒。例子【5】
- 临界资源:是一次仅允许一个进程使用的共享资源; 临界区:每个进程中访问临界资源的那段代码称为临界区,每次只允许一个进程进入临界区,进入后,不允许其他进程进入。
- synchronized,lock比较:
(1)来源: lock是一个接口,而synchronized是java的一个关键字,synchronized是内置的语言实现;
(2)异常是否释放锁: synchronized在发生异常时候会自动释放占有的锁,因此不会出现死锁;而lock发生异常时候,不会主动释放占有的锁,必须手动unlock来释放锁,可能引起死锁的发生。(所以最好将同步代码块用try catch包起来,finally中写入unlock,避免死锁的发生。)
(3)是否响应中断 :lock等待锁过程中可以用interrupt来中断等待,而synchronized只能等待锁的释放,不能响应中断;
(4)是否知道获取锁 :Lock可以通过trylock来知道有没有获取锁,而synchronized不能;
(5)Lock可以提高多个线程进行读操作的效率。(可以通过readwritelock实现读写分离)
在性能上来说,如果竞争资源不激烈,两者的性能是差不多的,而当竞争资源非常激烈时(即有大量线程同时竞争),此时Lock的性能要远远优于synchronized。所以说,在具体使用时要根据适当情况选择。
(6)synchronized使用Object对象本身的wait 、notify、notifyAll调度机制,而Lock可以使用Condition进行线程之间的调度。
(7)synchronized原始采用的是CPU悲观锁机制,即线程获得的是独占锁。而Lock用的是乐观锁方式。
- lock使用场景:
1.某个线程在等待一个锁的控制权的这段时间需要中断
2.需要分开处理一些wait-notify,ReentrantLock里面的Condition应用,能够控制notify哪个线程
3.具有公平锁功能,每个到来的线程都将排队等候
- ReentrantLock实现原理:【7】
- 彻底理解ThreadLocal:【8】【18】
-
Java 9 Reactive Streams【9】:取消订阅可能会导致主线程逻辑死循环、当发布者以比订阅者消费更快的速度生成消息时,会产生背压
-
Java实现生产者-消费者模型【10】:
1、BlockingQueue
2、wait && notify
3、简单的Lock && Condition(高级:生产、消费锁分离,以此让优化消费者与消费者(或生产者与生产者)之间是串行的;消费者与生产者之间是并行的,buffer在头部出队,尾部入队)
4、Semaphore
-
线程池的处理流程和原理:
![线程池处理任务流程](https://img-blog.csdnimg.cn/20190809154626951.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1FRc2lsaG9uZXR0ZQ==,size_16,color_FFFFFF,t_70)
- Synchronized与ReentrantLock有什么不同,各适用什么场景:在确实需要一些 synchronized 所没有的特性的时候,比如时间锁等候、可中断锁等候、无块结构锁、多个条件变量或者轮询锁。
- ReentrantReadWriteLock实现原理【13】:表示两个锁,一个是读操作相关的锁,称为共享锁;一个是写相关的锁,称为排他锁
- LockSupport:【14】
-
FutureTask【15】:
Runnable的run返回值是void类,Callable的submit返回值类型是Future,future接口包含cancel、isCancelled、isDone、get()、get(long timeout, TimeUnit unit)。
FutureTask可以直接创建对象,实现了RunnableFuture接口,RunnableFuture继承Runnable接口和Future接口。FutureTask既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值。
-
CompletableFuture【16】:
对Future的扩展,提供了函数式编程能力。
接口:1)thenApply:当前执行记过作为下一阶段入参;2)thenAccept:与thenApply区别是入参是Consumer;3)thenRun:不需要入参;4)thenCombine/thenAcceptBoth:整合两个计算结果,有/无返回值
;
5)applyToEither与acceptEither:取最先返回的,有/无返回值;6)allOf/anyOf:多任务都完成/任一完成。 -
CountDownLatch和CyclicBarrier的区别【17】:
CountDownLatch : 一个线程(或者多个), 等待另外N个线程完成某个事情之后才能执行。 CyclicBarrier : N个线程相互等待,任何一个线程完成之前,所有的线程都必须等待。
【1】https://www.cnblogs.com/monkey0307/p/9667606.html 《JAVA对象内存结构》
【2】https://blog.csdn.net/u010126792/article/details/82968521 《JVM学习之对象内存布局,对象头》
【3】https://www.jianshu.com/p/36eedeb3f912 《浅谈偏向锁、轻量级锁、重量级锁》
【4】https://blog.csdn.net/zhangdong2012/article/details/79983404 《Java并发-AQS及各种Lock锁的原理》
【5】https://www.jianshu.com/p/024a36b83099 《并发编程-BlockQueue线程容器》
【6】https://blog.csdn.net/tingfeng96/article/details/52219649 《synchronized 和Lock区别》
【7】https://www.jianshu.com/p/b6efbdbdc6fa 《ReentrantLock实现机制(CLH队列锁)》
【8】https://www.cnblogs.com/xzwblog/p/7227509.html 《彻底理解ThreadLocal》
【9】https://blog.csdn.net/why_still_confused/article/details/82351960 《Java 9 Reactive Streams》
【10】https://www.jianshu.com/p/3d4cbb969063 《Java实现生产者-消费者模型》
【11】https://www.jianshu.com/p/519803f392dc 《线程池的处理流程和原理》
【12】https://www.ibm.com/developerworks/cn/java/j-jtp10264/index.html 《JDK 5.0 中更灵活、更具可伸缩性的锁定机制》
【13】https://www.cnblogs.com/faunjoe88/p/7928757.html 《轻松掌握java读写锁(ReentrantReadWriteLock)的实现原理》
【14】https://www.cnblogs.com/qingquanzi/p/8228422.html 《自己动手写把”锁”---LockSupport深入浅出》
【15】https://www.cnblogs.com/dolphin0520/p/3949310.html 《Java并发编程:Callable、Future和FutureTask》
【16】https://www.jianshu.com/p/dade70be4edd 《java8的CompletableFuture使用实例》
【17】https://blog.csdn.net/kjfcpua/article/details/7300286 《CountDownLatch和CyclicBarrier的区别》
【18】https://www.jianshu.com/p/a1cd61fa22da 《ThreadLocal内存泄漏真因探究》