写点什么

多线程—可能你会遇到的多线程面试题都在这里了(含答案

用户头像
极客good
关注
发布于: 刚刚

如何停止一个线程


  • 使用 volatile 变量终止正常运行的线程 + 抛异常法/Return 法

  • 组合使用 interrupt 方法与 interruptted/isinterrupted 方法终止正在运行的线程 + 抛异常法/Return 法

  • 使用 interrupt 方法终止 正在阻塞中的 线程


何为线程安全的类?


在线程安全性的定义中,最核心的概念就是 正确性。当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么这个类就是线程安全的。


为什么线程通信的方法 wait(), notify()和 notifyAll()被定义在 Object 类里?


Object lock = new Object();


synchronized (lock) {


lock.wait();


...


}


Wait-notify 机制是在获取对象锁的前提下不同线程间的通信机制。在 Java 中,任意对象都可以当作锁来使用,由于锁对象的任意性,所以这些通信方法需要被定义在 Object 类里。


为什么 wait(), notify()和 notifyAll()必须在同步方法或者同步块中被调用?


wait/notify 机制是依赖于 Java 中 Synchronized 同步机制的,其目的在于确保等待线程从 Wait()返回时能够感知通知线程对共享变量所作出的修改。如果不在同步范围内使用,就会抛出 java.lang.IllegalMonitorStateException 的异常


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码



并发三准则


  • 异常不会导致死锁现象:当线程出现异常且没有捕获处理时,JVM 会自动释放当前线程占用的锁,因此不会由于异常导致出现死锁现象,同时还会释放 CPU;

  • 锁的是对象而非引用;

  • 有 wait 必有 notify;


如何确保线程安全?


  • 通过加锁(Lock/Synchronized)保证对临界资源的同步互斥访问;

  • 使用 volatile 关键字,轻量级同步机制,但不保证原子性;

  • 使用不变类 和 线程安全类(原子类,并发容器,同步容器等)。


volatile 关键字在 Java 中有什么作用


volatile 的特殊规则保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新,即保证了内存的可见性,除此之外还能 禁止指令重排序。此外,synchronized 关键字也可以保证内存可见性。


指令重排序问题在并发环境下会导致线程安全问题,volatile 关键字通过禁止指令重排序来避免这一问题。而对于 Synchronized 关键字,其所控制范围内的程序在执行时独占的,指令重排序问题不会对其产生任何影响,因此无论如何,其都可以保证最终的正确性。


ThreadLocal 及其引发的内存泄露


ThreadLocal 是 Java 中的一种线程绑定机制,可以为每一个使用该变量的线程都提供一个变量值的副本,并且每一个线程都可以独立地改变自己的副本,而不会与其它线程的副本发生冲突。


每个线程内部有一个 ThreadLocal.ThreadLocalMap 类型的成员变量 threadLocals,这个 threadLocals 存储了与该线程相关的所有 ThreadLocal 变量及其对应的值,也就是说,ThreadLocal 变量及其对应的值就是该 Map 中的一个 Entry,更直白地,threadLocals 中每个 Entry 的 Key 是 ThreadLocal 变量本身,而 Value 是该 ThreadLocal 变量对应的值。

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
多线程—可能你会遇到的多线程面试题都在这里了(含答案