发表于: 2020-08-26 23:04:57

1 1501


今天完成的事情

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 中获取对应的数据。这样就能做到线程安全,互不干扰。



返回列表 返回列表
评论

    分享到