ThreadLocal模式与synchronized关键字都是用于处理多线程并发访问变量的问题。只是两者处理问题的角度和思路不同。

1)ThreadLocal是一个Java类,通过对当前线程(Thread)中的局部变量的操作来解决不同线程的变量访问的冲突问题。所以,ThreadLocal提供了线程安全的共享对象机制,每个线程(Thread)都拥有其副本。

2)Java中的synchronized是一个保留字,它依靠JVM的锁机制来实现临界区的函数或者变量在访问中的原子性。在同步机制中,通过对象的锁机制保证同一时间只有一个线程访问变量。此时,被用作“锁机制”的变量是多个线程共享的。

同步机制采用了“以时间换空间”的方式,提供一份变量,让不同的线程排队访问。而ThreadLocal采用了“以空间换时间”的方式,为每一个线程都提供了一份变量的副本,从而实现同时访问而互不影响。

如下两种设计数据库连接的例子

1)ThreadLocal

  1. public class ConnectionManager {  
  2.   
  3.     private static ThreadLocal<Connection> connectionHolder = new ThreadLocal<Connection>() {  
  4.         @Override  
  5.         protected Connection initialValue() {  
  6.             Connection conn = null;  
  7.             try {  
  8.                 conn = DriverManager.getConnection(  
  9.                         "jdbc:mysql://localhost:3306/test", "username",  
  10.                         "password");  
  11.             } catch (SQLException e) {  
  12.                 e.printStackTrace();  
  13.             }  
  14.             return conn;  
  15.         }  
  16.     };  
  17.   
  18.     public static Connection getConnection() {  
  19.         return connectionHolder.get();  
  20.     }  
  21.   
  22.     public static void setConnection(Connection conn) {  
  23.         connectionHolder.set(conn);  
  24.     }  
  25. }  

 

2)synchronized

private static DBOPool instance=null;
    public static synchronized Connection getInstance(){
        if(instance==null)
            instance=new DBOPool();
        return instance.getConnection();
        
    }
}