Java基础ThreadLocal类4月打卡day22

举报
java厂长 发表于 2022/04/13 09:26:48 2022/04/13
【摘要】 Java基础ThreadLocal类4月打卡day22关于作者作者介绍🍓 博客主页:作者主页🍓 简介:JAVA领域优质创作者🥇、一名在校大三学生🎓、在校期间参加各种省赛、国赛,斩获一系列荣誉🏆。🍓 关注我:关注我学习资料、文档下载统统都有,每日定时更新文章,励志做一名JAVA资深程序猿👨‍💻。ThreadLocal类TheadLocal类不继承Thread类,也不实现Runa...

Java基础ThreadLocal类4月打卡day22

关于作者

  • 作者介绍


🍓 博客主页:作者主页

🍓 简介:JAVA领域优质创作者🥇、一名在校大三学生🎓、在校期间参加各种省赛、国赛,斩获一系列荣誉🏆。

🍓 关注我:关注我学习资料、文档下载统统都有,每日定时更新文章,励志做一名JAVA资深程序猿👨‍💻。

ThreadLocal类

TheadLocal类不继承Thread类,也不实现Runable接口,ThreadLocal类为每一个线程都维护了自己独有的变量拷贝。每个线程都拥有自己独立的变量。

ThreadLocal采用了“以空间换时间”的方式:访问并行化,对象独享化。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。

ThreadLocal的实现是这样的:每个Thread维护了一个ThreadLocalMap映射表,这个映射表的key是ThreadLocal实例本身。Value是真正需要存储的变量。也就是说,ThreadLocal本身并不存储值,它只是作为一个key来让线程从ThreadLocalMap获取value。注意,ThreadLocalMap是使用ThreadLocal的弱引用作为key的,弱引用的对象在GC时会被回收。

通过给方法传递参数,调用两个线程输出不同的信息

package com.day14.demo;
class Message{
    private String note;
​
    
​
    public String getNote() {
        return note;
    }
​
    public void setNote(String note) {
        this.note = note;
    };
}
class GetMessage{
    public void print(Message msg){
        System.out.println(Thread.currentThread().getName() + msg.getNote());
    }
}
public class ThreadLocalDemo {
    public static void main(String[] args) {
        new Thread(()->{
            Message message = new Message();
            message.setNote("Hello,world!!");
            new GetMessage().print(message);
        },"用户A").start();
        
        new Thread(()->{
            Message message = new Message();
            message.setNote("Hello,world!!zsr");
            new GetMessage().print(message);
        },"用户B").start();
    }
}

但是我现在的需求是不希望通过传递传输给GetMessage的print方法,还希望实现相同的功能。

package com.day14.demo;
class Message{
    private String note;
​
    
​
    public String getNote() {
        return note;
    }
​
    public void setNote(String note) {
        this.note = note;
    };
}
class GetMessage{
    public void print(){
        System.out.println(Thread.currentThread().getName() + MyUtil.message.getNote());
    }
}
class MyUtil{
    public static Message message;
}
public class ThreadLocalDemo {
    public static void main(String[] args) {
        new Thread(()->{
            Message msg = new Message();
            msg.setNote("Hello,world!!");
            MyUtil.message = msg;
            new GetMessage().print();
        },"用户A").start();
        
        new Thread(()->{
            Message msg = new Message();
            msg.setNote("Hello,world!!zsr");
            MyUtil.message = msg;
            new GetMessage().print();
        },"用户B").start();
    }
}

我们发现两个线程的内容并没有同步输出,所以我们会想到通过ThreadLocal类来解决此数据不同步的问题。

image-20210818114329415

public class ThreadLocal<T> extends Object

这个类里面有几个重要的方法:

  • 取得数据:public T get()

  • 存放数据:public void set(T value)

  • 删除数据:public void remove()

利用ThreadLocal来解决当前我问题

package com.day14.demo;
class Message{
    private String note;
​
    
​
    public String getNote() {
        return note;
    }
​
    public void setNote(String note) {
        this.note = note;
    };
}
class GetMessage{
    public void print(){
        System.out.println(Thread.currentThread().getName() + MyUtil.get().getNote());
    }
}
class MyUtil{
    private static ThreadLocal<Message> tl = new ThreadLocal<Message>();
    public static void set(Message msg){
        tl.set(msg);
    }
    public static Message get(){
        return tl.get();
    }
}
public class ThreadLocalDemo { 
    public static void main(String[] args) {
        new Thread(()->{
            Message msg = new Message();
            msg.setNote("Hello,world!!");
            MyUtil.set(msg);
            new GetMessage().print();
        },"用户A").start();
        
        new Thread(()->{
            Message msg = new Message();
            msg.setNote("Hello,world!!zsr");
            MyUtil.set(msg);
            new GetMessage().print();
        },"用户B").start();
    }
}

这样我们就解决了数据不同步的问题了。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。