吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1211|回复: 4
收起左侧

[求助] 关于ThreadLocal的问题

[复制链接]
猎祖猎宗 发表于 2020-11-26 15:41
private static ThreadLocal<Project> project = ThreadLocal.withInitial(()->new Project());public static void main(String[] args) throws ParseException, InterruptedException {
    new Thread(()-> {
        try {
            Project sdf = project.get();
            //Thread.sleep(10L);
            sdf.setCompany("");
            System.out.println(sdf+"----" + Thread.currentThread().getId());
            sdf.setCompany("C");
            System.out.println(sdf+"----" + Thread.currentThread().getId());
        } catch (Exception e) {
        }
    }).start();
    new Thread(()-> {
        try {
            Project sdf = project.get();
            sdf.setCompany("");
            System.out.println(sdf+"----" + Thread.currentThread().getId());
        } catch (Exception e) {
        }
    }).start();
    new Thread(()-> {
        try {
            Project sdf = project.get();
            System.out.println(sdf+"----" + Thread.currentThread().getId());
        } catch (Exception e) {
        }
    }).start();

    while (true);

}输出结果com.lzy.demo.ProjectDto.Project@141f979companynull----14com.lzy.demo.ProjectDto.Project@1424e98company啊----13com.lzy.demo.ProjectDto.Project@1424e98company啊----12com.lzy.demo.ProjectDto.Project@141f991companyC----12
请问为什么当我Project实体里面的值相同时,对象地址相同,而company发生改变是  线程12里面指向的地址发生了变化,这块搞不太懂,有大佬帮忙解答一下吗
387aea2b35b9b1c41e5175c9148e6bc.png

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 猎祖猎宗 发表于 2020-11-26 15:42
输出结果
a3f255b37da9fea432563d79fea1912.png
Vvvvvoid 发表于 2020-11-26 17:46
ThreadLocal 的作用是 单个线程内执行多个方法 可以做到参数共享

你创建了三个 线程, 每个线程里的 ThreadLocal 初始化都会 创建一个 Project 对象, 所以一共会创建 三个 对象

每个线程的 id 都是不同的 , 所以有三个线程ID , 而且 每个线程ID 对应的 Project 对象ID 是 不会变的

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
猎祖猎宗 + 1 + 1 谢谢@Thanks!

查看全部评分

不夏流年 发表于 2020-11-26 19:03
 楼主| 猎祖猎宗 发表于 2020-11-27 10:12
[Java] 纯文本查看 复制代码
 private static ThreadLocal<SimpleDateFormat> threadLocal = ThreadLocal.withInitial(()->new SimpleDateFormat("yyyy"));
    private static Object a,b,c;
    public static void main(String[] args) throws ParseException, InterruptedException {
        Thread threadA = new Thread(()->{
            Object object = threadLocal.get();
            a= object;
            System.out.println("线程名:"+Thread.currentThread().getName()+",输出结果"+object);
        });
        threadA.setName("A");

        Thread threadB = new Thread(()->{
            Object object = threadLocal.get();
            b = object;
            System.out.println("线程名:"+Thread.currentThread().getName()+",输出结果"+object);
        });
        threadB.setName("B");

        Thread threadC = new Thread(()->{
            Object object = threadLocal.get();
            c=object;
            System.out.println("线程名:"+Thread.currentThread().getName()+",输出结果"+object);
        });
        threadC.setName("C");
        threadA.start();
        threadB.start();
        threadC.start();
        threadA.join();
        threadB.join();
        threadC.join();
        System.out.println(b==c);
        System.out.println(c==a);
        System.out.println(a==b);
    }

输出结果
[Asm] 纯文本查看 复制代码
线程名:A,输出结果java.text.SimpleDateFormat@38d640
线程名:C,输出结果java.text.SimpleDateFormat@38d640
线程名:B,输出结果java.text.SimpleDateFormat@38d640
false
false
false

输出的结果调用toString,由于重写了SimpleDateFormat(问题中提到的Project对象同理)hashcode,看到    线程ABC输出结果java.text.SimpleDateFormat@38d640  都是一样的,
但是通过  把对象赋值 abc三个静态变量,然后发现 全是false,
[Java] 纯文本查看 复制代码
//SimpleDateFormat的hashCode
//实际为调用String的hashCode
public class SimpleDateFormat extends DateFormat {
private String pattern;
@Override
    public int hashCode()
    {
        return pattern.hashCode();
        // just enough fields for a reasonable distribution
    }
}

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-16 13:28

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表