|
57 | 57 |
|
58 | 58 | <!-- END doctoc generated TOC please keep comment here to allow auto update --> |
59 | 59 |
|
60 | | -> 大家好,我是大彬。最近在面试,看了很多面经,抽空将Java并发编程常见的面试题总结了一下,在这里分享给大家~ |
| 60 | +> 首先给大家分享一个github仓库,上面放了**200多本经典的计算机书籍**,包括C语言、C++、Java、Python、前端、数据库、操作系统、计算机网络、数据结构和算法、机器学习、编程人生等,可以star一下,下次找书直接在上面搜索,仓库持续更新中~ |
| 61 | +> |
| 62 | +> github地址:https://github.com/Tyson0314/java-books |
| 63 | +> |
| 64 | +> 如果github访问不了,可以访问gitee仓库。 |
| 65 | +> |
| 66 | +> gitee地址:https://gitee.com/tysondai/java-books |
61 | 67 |
|
62 | 68 | ## 线程池 |
63 | 69 |
|
|
66 | 72 | ### 为什么使用线程池? |
67 | 73 |
|
68 | 74 | - **降低资源消耗**。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 |
69 | | -- **提高响应速度**。当任务到达时,任务可以不需要的等到线程创建就能立即执行。 |
| 75 | +- **提高响应速度**。当任务到达时,可以不需要等到线程创建就能立即执行。 |
70 | 76 | - **提高线程的可管理性**。统一管理线程,避免系统创建大量同类线程而导致消耗完内存。 |
71 | 77 |
|
72 | 78 | ### 线程池执行原理? |
@@ -128,7 +134,7 @@ public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveT |
128 | 134 | } |
129 | 135 | ``` |
130 | 136 |
|
131 | | -- RejectedExecutionHandler:当队列和线程池都满了时,根据拒绝策略处理新任务。 |
| 137 | +- RejectedExecutionHandler:当队列和线程池都满了的时候,根据拒绝策略处理新任务。 |
132 | 138 |
|
133 | 139 | ```java |
134 | 140 | AbortPolicy:默认的策略,直接抛出RejectedExecutionException |
@@ -280,7 +286,7 @@ private static void test2() { |
280 | 286 | ### 创建线程有哪几种方式? |
281 | 287 |
|
282 | 288 | - 通过扩展Thread类来创建多线程 |
283 | | -- 通过实现Runnable接口来创建多线程,可实现线程间的资源共享 |
| 289 | +- 通过实现Runnable接口来创建多线程 |
284 | 290 | - 实现Callable接口,通过FutureTask接口创建线程。 |
285 | 291 | - 使用Executor框架来创建线程池。 |
286 | 292 |
|
@@ -339,8 +345,7 @@ class Runnable1 implements Runnable{ |
339 | 345 |
|
340 | 346 | 实现Runnable接口比继承Thread类所具有的优势: |
341 | 347 |
|
342 | | -1. 资源共享,适合多个相同的程序代码的线程去处理同一个资源 |
343 | | -2. 可以避免java中的单继承的限制 |
| 348 | +1. 可以避免java中的单继承的限制 |
344 | 349 | 3. 线程池只能放入实现Runable或Callable类线程,不能直接放入继承Thread的类 |
345 | 350 |
|
346 | 351 | **Callable 创建线程代码**: |
@@ -542,13 +547,13 @@ volatile关键字的两个作用: |
542 | 547 |
|
543 | 548 | AQS,AbstractQueuedSynchronizer,抽象队列同步器,定义了一套多线程访问共享资源的同步器框架,许多并发工具的实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch。 |
544 | 549 |
|
545 | | -AQS使用一个volatile的int类型的成员变量state来表示同步状态,通过CAS修改同步状态的值。当线程调用 lock 方法时 ,如果 state=0,说明没有任何线程占有共享资源的锁,可以获得锁并将 state=1。如果 state=1,则说明有线程目前正在使用共享变量,其他线程必须加入同步队列进行等待。 |
| 550 | +AQS使用一个volatile的int类型的成员变量state来表示同步状态,通过CAS修改同步状态的值。当线程调用 lock 方法时 ,如果 state=0,说明没有任何线程占有共享资源的锁,可以获得锁并将 state加1。如果 state不为0,则说明有线程目前正在使用共享变量,其他线程必须加入同步队列进行等待。 |
546 | 551 |
|
547 | 552 | ```java |
548 | 553 | private volatile int state;//共享变量,使用volatile修饰保证线程可见性 |
549 | 554 | ``` |
550 | 555 |
|
551 | | -同步器依赖内部的同步队列(一个FIFO双向队列)来完成同步状态的管理,当前线程获取同步状态失败时,同步器会将当前线程以及等待状态(独占或共享 )构造成为一个节点(Node)并将其加入同步队列并进行自旋,当同步状态释放时,会把首节中的后继节点对应的线程唤醒,使其再次尝试获取同步状态。 |
| 556 | +同步器依赖内部的同步队列(一个FIFO双向队列)来完成同步状态的管理,当前线程获取同步状态失败时,同步器会将当前线程以及等待状态(独占或共享 )构造成为一个节点(Node)并将其加入同步队列并进行自旋,当同步状态释放时,会把首节点中的后继节点对应的线程唤醒,使其再次尝试获取同步状态。 |
552 | 557 |
|
553 | 558 |  |
554 | 559 |
|
@@ -832,7 +837,7 @@ currentTime.remove(); |
832 | 837 |
|
833 | 838 | ### ThreadLocal使用场景有哪些? |
834 | 839 |
|
835 | | -ThreadLocal 适用场景:每个线程需要有自己单独的实例,且需要在多个方法中共享实例,即同时满足实例在线程间的隔离与方法间的共享。比如Java web应用中,每个线程有自己单独的 Session 实例,就可以使用ThreadLocal来实现。 |
| 840 | +ThreadLocal 适用场景:每个线程需要有自己单独的实例,且需要在多个方法中共享实例,即同时满足实例在线程间的隔离与方法间的共享,这种情况适合使用ThreadLocal。比如Java web应用中,每个线程有自己单独的 Session 实例,就可以使用ThreadLocal来实现。 |
836 | 841 |
|
837 | 842 |
|
838 | 843 |
|
@@ -1147,12 +1152,3 @@ public final void lazySet(int i, int newValue)//最终 将index=i 位置的元 |
1147 | 1152 | - AtomicMarkableReference :原子更新带有标记的引用类型。该类将 boolean 标记与引用关联起来 |
1148 | 1153 |
|
1149 | 1154 |
|
1150 | | - |
1151 | | -> 给大家分享一个github仓库,上面放了**200多本经典的计算机书籍**,包括C语言、C++、Java、Python、前端、数据库、操作系统、计算机网络、数据结构和算法、机器学习、编程人生等,可以star一下,下次找书直接在上面搜索,仓库持续更新中~ |
1152 | | -> |
1153 | | -> github地址:https://github.com/Tyson0314/java-books |
1154 | | -> |
1155 | | -> 如果github访问不了,可以访问gitee仓库。 |
1156 | | -> |
1157 | | -> gitee地址:https://gitee.com/tysondai/java-books |
1158 | | -
|
0 commit comments