发表于: 2020-08-26 23:04:57
1 1509
今天完成的事情
1.Java 线程生命周期
2.ThreadLocal
收获
1. Java 线程的生命周期
在 Thread 类中可以见到如下几种状态。
NEW
一个线程被创建之后的状态
RUNABLE
new 状态之后 start 即处于 runable 的状态,这个时候即使是 IO 操作也属于 runbale 状态,在 JVM 看来在进行 IO 操作也是在运行。
BLOCKED
在 Java 中只有等待一个对象锁(monitor lock)的时候才是 blocked 状态
WAITTING
只有在执行 Object.wait() Thread.join() LockSupport.park() 的时候才是 waitting 状态
TIME_WAITTING
只有在执行如下方法的时候才是 time_waitting 状态
Thread.sleep()
Object.wait()
Thread.join()
LockSupport.parkNanos()
LockSupport.parkUtil()
2. ThreadLocal
在做并发编程的时候,如果成员变量不作任何处理的话是线程不安全的,这个时候就需要一种全局变量来为我们管理所有线程内部的。
在 Java 中每个线程都维护了一个名为 ThreadLocalMap 的 Map,结合我们每个线程的 id,我们就可以在里面取到当前线程的变量。
public final class ConnectionUtil {
private ConnectionUtil() {}
private static final ThreadLocal<Connection> conn = new ThreadLocal<>();
public static Connection getConn() {
Connection con = conn.get();
if (con == null) {
try {
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("url", "userName", "password");
conn.set(con);
} catch (ClassNotFoundException | SQLException e) {
// ...
}
}
return con;
}
}
在使用 get() 方法的时候其实是线获取了当前线程的线程 id,然后去 ThreadLocalMap 中获取对应的数据。这样就能做到线程安全,互不干扰。
评论