Java[学习总结]-多线程(六)之ThreadLocal类

1.为什么要使用ThreadLocal类

1.1

class ConnectionManager {
private static Connection connect = null;
public static synchronized Connection openConnection()
{if(connect == null){
connect = DriverManager.getConnection();
}
return connect;
}
public static synchronized void closeConnection() {
if(connect!=null) connect.close(;
}}

(1)这里面的2个方法都没有进行同步,很可能在openConnection方法中会多次创建connect
(2)由于connect是共享变量,那么必然在调用connect的地方需要使用到同步来保障线程安全,因为很可能一个线程在使用connect进行数据库操作,而另外一个线程调用closeConnection关闭链接。
(3)这样将会大大影响程序执行效率,因为一个线程在使用connect进行数据库操作的时候,其他线程只有等待。

2.1

class ConnectionManager {
private static Connection connect = null;
public static Connection openConnection( {
if(connect = null){
connect = DriverManager.getConnection();
}
return connect;
}
public void closeConnection() {
if( connect!=null)
connect.close(;
}}

(1)假如每个线程中都有一个connect变量,各个线程之间对connect变量的访问实际上是没有依赖关系的,即一个线程不需要关心其他线程是否对这个connect进行了修改的。
(2)每次都是在方法内部创建的连接,那么线程之间自然不存在线程安全问题。但是这样会有一个致命的影响:导致服务器压力非常大,并且严重影响程序执行性能。由于在方法中需要频繁地开启和关闭数据库连接,这样不尽严重影响程序执行效率,还可能导致服务器压巨大。

2.ThreadLocal类

2.1 定义
ThreadL ocal在每个线程中对所使用变量会创建一个副本,即每个线程内部都会有一个该变量,且在线程内部任何地方都可以使用,线程之间互不影响,这样一来就不存在线程安全问题,也不会严重影响程序执行性能。要考虑它对资源的消耗,比如内存的占用会比不使用ThreadLocal要大。

2.2 特点
(1)在普通同步中机制中,是通过对象加锁来实现多个线程对同一变量的安全访问。ThreadLocal是从另一个角度解决多线程的并发访问。它将需要并发访问的资源复制出多份来,每个线程拥有一份资源,每个线程都拥有自己的资源副本,从而没有必须对该变量进行同步了。
(2)ThreadLocal提供资源的共享对象!

2.3 语法
ThreadL ocal是Thread L ocal Variable的意思,为每个线程提供一个变量值 的副本。只提供三个public方法。
(1)Tget():返回此线程局部变量中当前线程副本的值
(2)void remove():删除此线程局部变量中当前副本的值
(3)void set(T value);设置此线程局部变量中当前线程副本的值

public class MyThread extends Thread{
    private static ThreadLocal<String> threadLocal = new ThreadLocal<>();
    public static void main(String[] args) {
         MyThread thread = new MyThread();
         Thread t = new Thread(thread);
         t.start();
        System.out.println(threadLocal.get());
        threadLocal.remove();
            }
    @Override
    public void run() {
        super.run();
        threadLocal.set("Test");
    }
    }
}

3.ThreadLocal与同步的区别

(1)ThreadLocal并不能替代同步机制,同步机制是为了同步多个线程对相同资源的并发访问,是多个线程之间的进行通信的有效方式; ThreadLocal是隔离多个线程的数据通向,从根本上避免多个线程之间共享资源。
(2)如果需要进行多个线程之间共享资源,已达到线程之间的通信功能,就使用同步机制;如果仅仅需要隔离多个线程之间的共享冲突,可以使Threadlocal。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值