并发与多线程

  • CAS:首先CPU将内存中的将要被修改的数据与预期的值进行比较,如果这两个值相等,CPU则会将内存中数值替换为新值,否则不做操作。
  • Synchronized原理:

    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

  • 线程池的处理流程和原理:

线程池处理任务流程
线程池处理任务流程

 

  • 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内存泄漏真因探究》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值