ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
### 1 Java多线程技能 Thread有8个构造函数;带ThreadGroup的四种,带Runnable的两种,一种空,一种带字符串; 一个runnable多个线程容易构造出非线程安全情况; println()方法内部是同步的; currentThread()方法返回代码段正在被哪个线程调用的信息; Java退出线程的3种方法:退出标记、stop、interrupt; 线程sleep的时候interrupt()会抛出异常,并清除停止标记; Thread.stop()会抛出public class ThreadDeath extends Error,可以进行捕获; interrupt()方法只是在当前线程中设置一个中断标记; 用yield方法可以让当前线程把运行的优先级让给别的线程,构造示例:一个线程进行5万个数字累加,加上yield方法,会导致整个运行时间变长; setPriority()方法可以设置线程的优先级,构造示例:5万个数字累加,高优先级的线程执行的时间段; 守护线程setDaemon(true),用户线程没有了,守护线程也就结束了,GC就是守护线程,构造示例:守护线程不停的打印,主线程退出,守护线程也不执行了; ### 2 对象及变量的并发访问 方法内部的私有变量不存在非线程安全问题; synchronized方法是对当前对象进行加锁,synchronized代码块是对某一个对象加锁; JVM中String的常量池功能,可能导致锁是一个锁; 如果锁是String,锁对象在线程中改变了,可能导致其他线程异步执行; 如果锁是对象,对象属性改变了,锁不会改变; volatile强制从公共堆栈中获取变量的值,而不是从线程私有数据栈中获取变量的值; ### 3 线程间通信 sleep不会释放锁; notify()不会释放锁,要等synchronized块执行完毕之后才释放锁; wait()会立即释放锁; wait的时候interrupt会报InterruptedException异常;