0 0

java的ThreadLocal是否能被其他线程访问到?里面的机制是怎么样的5

java的ThreadLocal是否能被其他线程访问到?里面的机制是怎么样的
2012年4月15日 11:53

2个答案 按时间排序 按投票排序

0 0

采纳的答案

threadlocal是针对 per-thread的,不会被其他线程并发访问。
threadlocal变量和单个线程关联,简单来讲,类似于(具体可参考jdk源码):

public class FakeThreadLocal<T> {
  private final Map<Thread, T> values = new HashMap<Thread, T>();

  public T get() {
    return values.get(Thread.currentThread());
  }

  public void set(T t) {
    values.put(Thread.currentThread(), t);
  }
}

应用场景1,创建一个 SimpleDateFormat实例的开销比较昂贵,解析字符串时间时频繁创建生命周期短暂的实例导致性能低下。即使将 SimpleDateFormat定义为静态类变量,貌似能解决这个问题,但是SimpleDateFormat是非线程安全的,同样存在问题,如果用 ‘synchronized’线程同步同样面临问题,同步导致性能下降(线程之间序列化的获取SimpleDateFormat实例)。
使用Threadlocal解决了此问题,对于每个线程SimpleDateFormat不存在影响他们之间协作的状态,为每个线程创建一个SimpleDateFormat变量的拷贝或者叫做副本。
public class Test
{
    // SimpleDateFormat is not thread-safe, so give one to each thread
    private static final ThreadLocal<SimpleDateFormat> formatter = new ThreadLocal<SimpleDateFormat>(){
        @Override
        protected SimpleDateFormat initialValue()
        {
            return new SimpleDateFormat("yyyyMMdd HHmm");
        }
    };

    public String formatIt(Date date)
    {
        return formatter.get().format(date);
    }
}


应用场景2,在servlet/filter中保存初始状态,以便解决并发问题。
应用场景3,在一些框架中保存和当前线程有关的上下文。



2012年4月15日 13:08
0 0

每个线程有个单独的ThreadLocal,用于解决变量线程不安全的问题,所以不能被访问到。机制就是把当前线程作为key,value存储你要存储的东西

2012年4月15日 12:20

相关推荐

    Java ThreadLocal详解_动力节点Java学院整理

    从本质上说,ThreadLocal是一种存储机制,它可以在每个线程中存储一个变量的副本,这样每个线程都可以访问自己的变量副本,而不需要与其他线程共享同一个变量。这种机制可以解决多线程编程中的线程安全问题,并且...

    java 简单的ThreadLocal示例

    如果多个线程需要访问相同的数据,但是每个线程都需要自己的副本,ThreadLocal可以帮助避免使用同步机制,提高性能。 3. **线程配置:** 在一些框架或库中,如Spring,ThreadLocal被用来存储线程相关的配置信息。...

    JAVA ThreadLocal类深入

    Java中的ThreadLocal类是一种线程绑定机制,用于在多线程环境中为每个线程提供独立的变量副本,避免了线程间的数据共享带来的并发访问问题。ThreadLocal并不是一个线程对象,而是线程局部变量,即...

    Java多线程 之 临界区、ThreadLocal.docx

    Java多线程编程中,临界区和ThreadLocal是两种重要的并发控制机制,它们用于解决多线程环境下的数据安全问题。 1. **临界区(Critical Section)** 临界区是指一段代码,它在同一时刻只允许一个线程进行访问。在...

    java中ThreadLocal类的使用

    总结,`ThreadLocal`是Java中用于实现线程局部变量的工具,它提供了一种简单的方式在多线程环境下隔离数据,避免了传统的同步机制。但是,使用时需注意其潜在的内存泄漏风险和对代码可读性的影响,合理地选择使用...

    ThreadLocal应用示例及理解

    - ThreadLocal不是线程同步机制,不能用来解决多个线程访问共享资源的问题。 - 不要将ThreadLocal用作全局变量,否则可能导致内存泄漏。 - 使用ThreadLocal时,要特别注意线程结束后的清理工作,防止内存泄漏。 - ...

    使用Java ThreadLocal.docx

    Java中的ThreadLocal是一个非常有用的工具类,它提供了一种线程局部变量的机制。线程局部变量(ThreadLocal)的特点是每个线程都有其独立的副本,这些副本之间互不干扰,即使它们共享同一个ThreadLocal实例。这使得...

    简单分析Java线程编程中ThreadLocal类的使用共

    Java线程编程中的ThreadLocal类是一个非常重要的工具,它在多线程环境下提供了一种线程局部变量的机制。ThreadLocal并非是简单的变量,而是一种能够确保每个线程都拥有独立副本的变量容器。理解ThreadLocal的工作...

    Java并发编程学习之ThreadLocal源码详析

    ThreadLocal是Java并发编程中的一种机制,用于解决多线程访问共享变量的问题。它可以使每个线程对共享变量的访问都是线程安全的,使得多线程编程变得更加简单。 ThreadLocal的实现原理是基于ThreadLocalMap的, ...

    Java ThreadLocal类应用实战案例分析

    从输出结果可以看到,两条线程访问同一个Account时看到不同的name值。 四、相关操作注意事项 在使用ThreadLocal类时,需要注意以下几点: * ThreadLocal变量的生命周期是与线程绑定的,线程结束时,ThreadLocal...

    ThreadLocal

    ThreadLocal是一个非常重要的Java并发工具类,它的核心概念在于为每一个线程提供了一个独立的变量副本,从而避免了线程之间的数据竞争问题。这使得每个线程在访问ThreadLocal变量时,实际上是在访问该变量的一个独立...

    深入理解 Java 之 ThreadLocal 工作原理1

    当其他线程访问同一个ThreadLocal实例时,它们会拥有自己的ThreadLocalMap,所以不会影响到其他线程中ThreadLocal的值。这就是为什么在上述示例中,主线程、Thread1和Thread2能够分别设置和获取不同的ThreadLocal值...

    JAVA并发-自问自答学ThreadLocal.pdf

    当线程访问ThreadLocal的get()或set()方法时,实际上是访问的是与当前线程绑定的副本,而不是全局唯一的变量。 - ThreadLocal并不直接存储值,而是通过Thread类中的ThreadLocalMap来存储。ThreadLocalMap是...

    ThreadLocal相关

    当多个线程访问同一个 ThreadLocal 变量时,每个线程将拥有其自己的变量副本,而不是共享同一个变量。 ThreadLocal 的特点 1. 线程独立:ThreadLocal 变量在线程之间是独立的,每个线程都有其自己的变量副本。 2. ...

    java经典多线程面试题

    在Java中,多线程是一种非常重要的编程概念,它允许在单一程序中同时运行多个线程来执行不同的任务,从而提高程序的执行效率和资源利用率。Java提供了丰富的API和语言特性来支持多线程编程。以下是一些经典的多线程...

    java核心知识点学习----多线程间的数据共享和对象独立,ThreadLocal详解.pdf

    Java中的多线程编程是开发高并发应用的关键技术之一,涉及到如何有效管理和利用系统资源,尤其是在处理并发数据访问时,确保数据的安全性和一致性至关重要。在Java中,有多种方式可以实现线程间的数据共享和对象独立...

    java 中ThreadLocal本地线程和同步机制的比较

    Java中的ThreadLocal是一种特殊的技术,它为每个线程提供了一个独立的变量副本,避免了多线程间的直接共享,从而简化了并发编程的复杂性。ThreadLocal不是一种同步机制,而是设计来解决线程间数据隔离问题的工具。 ...

    ThreadLocal原理及在多层架构中的应用

    - **线程安全的配置对象**:在多层架构中,如Spring框架中,可以使用ThreadLocal来存储线程相关的配置信息,如数据库连接、事务管理等,确保这些对象不会被其他线程访问。 - **HTTP请求上下文**:在Web应用中,可以...

    java线程安全测试

    Java线程安全是多线程编程中的一个关键概念,它涉及到多个线程访问共享资源时可能出现的问题。在Java中,线程安全问题通常与并发、内存模型和可见性有关。Java内存模型(JMM)定义了如何在多线程环境下共享数据的...

    使用ThreadLocal管理“session”数据

    在Java编程中,ThreadLocal是线程局部变量的类,它提供了一种在多线程环境中为每个线程创建和维护独立副本的机制。ThreadLocal主要用于解决线程间的数据隔离问题,确保各线程拥有自己的变量副本,避免了数据共享带来...

Global site tag (gtag.js) - Google Analytics