# JUC **Repository Path**: mj4life/juc ## Basic Information - **Project Name**: JUC - **Description**: 并发编程学习记录 - **Primary Language**: Java - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-08-16 - **Last Updated**: 2022-02-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: juc, Java ## README # juc #### 介绍 并发编程学习记录 #### lock和synchronized的区别 1. 用法上的不同:synchronized既可以加在方法上,也可以加载特定代码块上,而lock需要显示地指定起始位置和终止位置。synchronized是托管给JVM执行的,lock的锁定是通过代码实现的,它有比 synchronized更精确的线程语义。 2. 性能上的不同: lock接口的实现类ReentrantLock,不仅具有和synchronized 相同的并发性和内存语义,还多了超时的获取锁、定时锁、等候和中断锁等。在竞争不是很激烈的情况下,synchronized的性能优于ReentrantLock,竞争激烈的情况下synchronized 的性能会下降的非常快,而 ReentrantLock则基本不变。 3. 锁机制不同:synchronized获取锁和释放锁的方式都是在块结构中,当获取多个锁时,必须以相反的顺序释放,并且是自动解锁。而Lock则需要开发人员手动释放,并且必须在finally中释放,否则会引起死锁。 #### 多线程编程步骤 1. 第一步,创建资源类,并在资源类中创建属性和操作方法 2. 第二步,在资源类的操作方法中实现三步:判断、干活、通知 3. 第三步,创建多线程,调用资源类的操作方法 4. 第四步,防止虚假唤醒的问题 #### 常见集合线程不安全以及解决方案 1. ArrayList线程不安全, 解决:(1)使用Vector;(2)使用Collections里的synchronizedList方法;(3)使用CopyOnWriteArrayList解决,兼顾并发读,独立写操作 2. HashSet线程不安全 解决:使用CopyOnWriteArraySet解决,兼顾并发读,独立写操作 3. HashMap线程不安全 解决:(1)使用ConcurrentHashMap;(2)使用Collections下的synchronizedMap #### Runnable接口和Callable接口 1. 是否有返回值 2. 是否抛出异常 3. 实现方法名称不同,一个是run方法,一个是call方法 #### 死锁、产生死锁的原因以及如何判断是否为死锁 1. 多个进程可以竞争有限数量的资源。当一个进程申请资源时,如果这时没有可用资源,那么这个进程进入等待状态。有时,如果所申请的资源被其他等待进程占有,那么该等待进程有可能再也无法改变状态。这种情况成为死锁。 2. 互斥:资源必须处于非共享模式,即一次只有一个进程可以使用。如果另一进程申请该资源,那么必须等待直到该资源被释放为止。 占有并等待:一个进程至少应该占有一个资源,并等待另一资源,而该资源被其他进程所占有。 非抢占:资源不能被抢占。只能在持有资源的进程完成任务后,该资源才会被释放。 循环等待:有一组等待进程 {P0, P1,..., Pn}, P0 等待的资源被 P1 占有,P1 等待的资源被 P2 占有,......,Pn-1 等待的资源被 Pn 占有,Pn 等待的资源被 P0 占有。 3. jps,类似linux的ps -ef命令,然后使用jvm自带的栈堆跟踪工具即可判断当前是否出现死锁现象 #### synchronized实现同步的基础:Java中的每一个对象都可以作为锁。具体表现为以下3种形式。 1. 对于普通同步方法,锁是当前实仍阏寸象。 2. 对于静态同步方法,锁是当前类的class对象。 3. 对于同步方法块,锁是synchonized括号里配置的对象。 #### 线程池的常见拒绝策略 1. AbortPolicy(默认):直接抛出RejectedExecutionException异常阻止系统正常运行 2. CallerRunsPolicy:“调用者运行”,一种调节机制,该策略既不会抛弃任务,也不会抛出异常,而是将某些任务回退到调用者,从而降低新任务的流量。 3. DiscardOldestPolicy:抛弃队列中等待最久的任务,然后把当前任务加人队列中尝试再次提交当前任务。 4. DiscardPolicy:该策略默默地丢弃无法处理的任务,不予任何处理也不抛出异常。如果允许任务丢失,这是最好的一种策略。 #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)