办理步伐:
- 在遍历进程中,全部涉及到改变 modCount 值得处所所有加上 synchronized;
- 行使 CopyOnWriteArrayList 来替代 ArrayList。
小结:本末节是 Java 中关于荟萃的考查,是 Java 岗亭口试中必考的常识点,除了应该把握以上的题目,包罗各个荟萃的底层实现也提议列位同窗阅读,加深领略。
(三)高并发编程-JUC 包
在 Java 5.0 提供了 java.util.concurrent(简称 JUC )包,在此包中增进了在并发编程中很常用的适用器材类,用于界说相同于线程的自界说子体系,包罗线程池、异步 IO 和轻量级使命框架。
1)多线程和单线程的区别和接洽:
答:
- 在单核 CPU 中,将 CPU 分为很小的时刻片,在每一时候只能有一个线程在执行,是一种微观上轮番占用 CPU 的机制。
- 多线程会存在线程上下文切换,会导致措施执行速率变慢,即回收一个拥有两个线程的历程执行所必要的时刻比一个线程的历程执行两次所必要的时刻要多一些。
结论:即回收多线程不会进步措施的执行速率,反而会低落速率,可是对付用户来说,可以减罕用户的相应时刻。
2)怎样指定多个线程的执行次序?
理会:口试官会给你举个例子,怎样让 10 个线程凭证次序打印 0123456789?(写代码实现)
答:
- 设定一个 orderNum,每个线程执行竣事之后,更新 orderNum,指明下一个要执行的线程。而且叫醒全部的守候线程。
- 在每一个线程的开始,要 while 判定 orderNum 是否便是本身的要求值!!不是,则 wait,是则执行本线程。
3)线程和历程的区别:(必考)
答:
- 历程是一个 “执行中的措施”,是体系举办资源分派和调治的一个独立单元;
- 线程是历程的一个实体,一个历程中拥有多个线程,线程之间共享地点空间和其余资源(以是通讯和同步等操纵线程比历程越发轻易);
- 线程上下文的切换比历程上下文切换要快许多。
- (1)历程切换时,涉及到当前历程的 CPU 情形的生涯和新被调治运行历程的 CPU 情形的配置。
- (2)线程切换仅必要生涯和配置少量的寄存器内容,不涉及存储打点方面的操纵。
4)多线程产存亡锁的 4 个须要前提?
答:
- 互斥前提:一个资源每次只能被一个线程行使;
- 哀求与保持前提:一个线程因哀求资源而阻塞时,对已得到的资源保持不放;
- 不剥夺前提:历程已经得到的资源,在未行使完之前,不能强行剥夺;
- 轮回守候前提:多少线程之间形成一种头尾相接的轮回守候资源相关。
口试官:怎样停止死锁?(常常接着问这个题目哦~)
答:指定获取锁的次序,举譬喻下:
- 好比某个线程只有得到 A 锁和 B 锁才气对某资源举办操纵,在多线程前提下,怎样停止死锁?
- 得到锁的次序是必然的,好比划定,只有得到 A 锁的线程才有资格获取 B 锁,按次序获取锁就可以停止死锁!!!
5)sleep( ) 和 wait( n)、wait( ) 的区别:
答:
- sleep 要领:是 Thread 类的静态要领,当前列程将就寝 n 毫秒,线程进入阻塞状态。当就寝时刻到了,会扫除阻塞,举办可运行状态,守候 CPU 的到来。就寝不开释锁(假若有的话);
- wait 要领:是 Object 的要领,必需与 synchronized 要害字一路行使,线程进入阻塞状态,当 notify 可能 notifyall 被挪用后,会扫除阻塞。可是,只有从头占用互斥锁之后才会进入可运行状态。就寝时,开释互斥锁。
6)synchronized 要害字:
答:底层实现:
- 进入时,执行 monitorenter,将计数器 +1,开释锁 monitorexit 时,计数器-1;
- 当一个线程判定到计数器为 0 时,则当前锁空闲,可以占用;反之,当前列程进入守候状态。
寄义:(monitor 机制)
Synchronized 是在加锁,加工具锁。工具锁是一种重量锁(monitor),synchronized 的锁机制会按照线程竞争环境在运行时会有方向锁(单一线程)、轻量锁(多个线程会见 synchronized 地区)、工具锁(重量锁,多个线程存在竞争的环境)、自旋锁等。
该要害字是一个几种锁的封装。
7)volatile 要害字
答:该要害字可以担保可见性不担保原子性。
成果:
- 主内存和事变内存,直接与主内存发生交互,举办读写操纵,担保可见性;
- 榨取 JVM 举办的指令重排序。
理会:关于指令重排序的题目,可以查阅 DCL 双检锁失效相干资料。
8)ThreadLocal(线程局部变量)要害字:
答:当行使 ThreadLocal 维护变量时,其为每个行使该变量的线程提供独立的变量副本,以是每一个线程都可以独立的改变本身的副本,而不会影响其他线程对应的副本。
ThreadLocal 内部实现机制:
- 每个线程内部城市维护一个相同 HashMap 的工具,称为 ThreadLocalMap,里边会包括多少了 Entry(K-V 键值对),响应的线程被称为这些 Entry 的属主线程;
- Entry 的 Key 是一个 ThreadLocal 实例,Value 是一个线程特有工具。Entry 的浸染等于:为其属主线程成立起一个 ThreadLocal 实例与一个线程特有工具之间的对应相关;
- Entry 对 Key 的引用是弱引用;Entry 对 Value 的引用是强引用。

9)Atomic 要害字:
答:可以使根基数据范例以原子的方法实现自增自减等操纵。参考我的博客:concurrent.atomic 包下的类 AtomicInteger 的行使。
10)线程池有相识吗?(必考)
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|