`
yingwuhahahaha
  • 浏览: 17702 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
社区版块
存档分类
最新评论

答复: 简明扼要,再谈ThreadLocal和synchronized

 
阅读更多

[quote="rehte"][quote="linliangyi2007"] 楼上的,对纵向的理解是不对的。变量x对于线程而言是安全的,而非不安全的。如果X是java的原生类型,则在每个线程中存在的是X的值副本;如果X是对象类型,那么每个线程中的对象引用也是不同的,因为对方法中的X的值改变,只影响当前X的引用(或者说指针的指向),不会影响其他线程的副本值,这也是所谓副本的含义。你可以做个实验。 [/quote] 当x是对象类型时,X必须是逃逸型引用,而不能是非逃逸型引用,即X是通过在本地方法中产生的,这就是所谓local的含义。如果X是非逃逸型的,则仍然有同步问题。比如: [code] class A{ private Object v; public A(){ v=new Object(); } public ThreadLocal method1(){ ThreadLocal local=new ThreadLocal(); local.set(v); //对象v是非逃逸型引用,这儿的local所引用的对像是非同步安全的 return local; } public ThreadLocal method2(){ ThreadLocal local = new ThreadLocal(); local.set(new Object()); //这儿的值是逃逸类型的,因此local是同步安全的 return local; } public void methodUseLocal(){ ThreadLocal local1=method1(); Object tempv1=local1.get(); //这儿的tempv1其实就是this.v,因此是非线程安全的 //... ThreadLocal local2=method2(); Object tempv2=local2.get(); //这儿的tempv2是线程安全的,是和当前线程绑定的变量 //... } } [/code][/quote] 楼上提醒的是。实际上,我们对于一个方法是用ThreadLocal来对本地变量进行副本的时候,大多指的是方法内部变量(请看我的示意图,X是方法内部的local varible)。要对类变量进行共享的话,不是ThreadLocal设计的目的。但确实存在这样的问题,值得大家注意。

分享到:
评论

相关推荐

    Synchronized与ThreadLocal

    ### Synchronized与ThreadLocal #### 一、Synchronized机制详解 **Synchronized** 是 Java 中一个非常重要的关键字,主要用于实现线程同步。它通过在对象上加锁来确保多个线程能够安全地访问共享资源。 - **作用...

    threadlocal:java.lang.ThreadLocal 的实验性无等待并发实现

    这个实验性的实现旨在优化`ThreadLocal`的正确性、性能、内存使用和并发控制策略,以适应高并发环境。 【描述】:“此实现是一项实验,旨在与现有实现相比提高正确性、性能、内存使用和自由度。” 现有的`...

    ThreadLocal应用示例及理解

    **线程局部变量(ThreadLocal)是Java编程中一个非常重要的工具类,它在多线程环境下提供了线程安全的数据存储。ThreadLocal并不是一个变量,而是一个类,它为每个线程都创建了一个独立的变量副本,使得每个线程都...

    ThreadLocal

    ThreadLocal通常被用来解决线程共享数据时可能出现的并发问题,避免了使用synchronized关键字进行同步控制的复杂性。 在Java中,ThreadLocal的工作原理是为每个线程创建一个单独的存储空间,每个线程可以独立地读写...

    入研究java.lang.ThreadLocal类.docx

    ### 知识点详解:Java.lang.ThreadLocal 类 #### 一、概述 **ThreadLocal** 并非线程的一种特殊实现形式,而是一种为每个线程...理解 ThreadLocal 的工作原理和应用场景对于编写高效可靠的多线程应用程序至关重要。

    JAVA ThreadLocal类深入

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

    Java中ThreadLocal的设计与使用

    理解ThreadLocal的工作原理和使用方法对于编写高效、安全的多线程程序至关重要。 ### ThreadLocal简介 ThreadLocal并非一个线程对象,而是一个线程局部变量的容器。每个线程都有自己的ThreadLocal实例,它们各自...

    ThreadLocal的用处

    ThreadLocal是Java的`java.lang.ThreadLocal`类,它的主要作用和用法如下: 1. **线程局部变量**: ThreadLocal并不是一个存储数据的容器,而是一个用于创建线程局部变量的模板。当你在ThreadLocal中创建一个实例...

    threadLocal

    3. 内存管理:了解Java的内存模型和垃圾回收机制,才能理解ThreadLocal的内存泄漏风险和弱引用的作用。 4. HTTP相关:虽然题目中没有直接涉及,但HTTPClient是一个常见的网络通信工具,经常和ThreadLocal结合使用,...

    ThreadLocal的几种误区

    ThreadLocal是Java编程中一种非常特殊的变量类型,它主要用于在多线程环境下为每个线程提供独立的变量副本,从而避免了线程间的数据共享和冲突。然而,ThreadLocal在理解和使用过程中容易产生一些误区,这里我们将...

    ThreadLocal内存泄露分析

    此外,分析ThreadLocal内存泄露可以借助一些工具,例如JProfiler、VisualVM或Java自带的JConsole等,它们可以帮助我们观察和定位内存中的异常情况。 了解ThreadLocal的内存泄露机制以及如何避免它,对于编写高效、...

    JDK的ThreadLocal理解(一)使用和测试

    **标题:“JDK的ThreadLocal理解(一)使用和测试”** **正文:** ThreadLocal是Java中的一个非常重要的线程安全工具类,它在多线程编程中扮演着独特的角色。通过创建ThreadLocal实例,我们可以为每个线程提供一个...

    ThreadLocal简单Demo

    **线程局部变量(ThreadLocal)** 在Java编程中,`ThreadLocal`是一个非常重要的工具类,它用于在多线程环境中提供线程安全的局部变量。`ThreadLocal`并不是一个线程,而是一个线程局部变量的容器,每个线程都有自己...

    threadlocal.rar

    ThreadLocal不是用来解决线程安全问题的,而是为每个线程创建独立的变量副本,确保线程间的变量隔离,避免了线程之间的数据共享和潜在的并发冲突。 ThreadLocal的工作原理可以这样理解:每个ThreadLocal实例都会为...

    ThreadLocal的原理,源码深度分析及使用.docx

    ThreadLocal 对象的访问和更新是通过 get 和 set 方法来实现的。get 方法用于获取 ThreadLocal 对象的值,set 方法用于设置 ThreadLocal 对象的值。这些方法都是线程安全的,能够保证多线程环境下的访问安全。 ...

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

    **线程局部变量(ThreadLocal)是Java编程中一个非常重要的概念,主要用于在多线程环境中为每个线程提供独立的变量副本。ThreadLocal不是一种数据结构,而是一种解决线程间共享数据的方式,它提供了线程安全的局部...

Global site tag (gtag.js) - Google Analytics