• 【多线程 - 10、线程同步3 ThreadLocal】


    一、ThreadLocal

    1、介绍

    可以实现资源对象的线程隔离;可以实现了线程内的资源共享

    如果使用 ThreadLocal 管理变量,则每一个使用该变量的线程都获得该变量的副本, 副本之间相互独立,这样每一个线程都可以随意修改自己的变量副本,而不会对其他线程产生影响

    2、常用方法

    • ThreadLocal() : 创建一个线程本地变量
    • get() : 返回此线程局部变量的当前线程副本中的值
    • initialValue() : 返回此线程局部变量的当前线程的"初始值"
    • set(T value) : 将此线程局部变量的当前线程副本中的值设置为 value

    3、编程

    例子:四个线程卖10张票

    是分别卖10张票

    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    public class ThreadTest {
        public static void main(String[] args) {
            synchronizeThread st = new synchronizeThread();
            new Thread(st, "1").start();
            new Thread(st, "2").start();
            new Thread(st, "3").start();
            new Thread(st, "4").start();
        }
    }
    
    class synchronizeThread implements Runnable {
        ThreadLocal<Integer> ticketNumber = new ThreadLocal<Integer>() {//创建实例对象
            @Override
            protected Integer initialValue() {
                return 10;//初始值
            }
        };
    
        @Override
        public void run() {
            for (int i = 0; i < 100; i++) {
                if (ticketNumber.get() > 0) {//get得到值
                    System.out.println("线程【" + Thread.currentThread().getName() + "】卖出了一张票,现在剩余了【" + ticketNumber.get() + "】张票");
                    ticketNumber.set(ticketNumber.get() - 1);//set修改值
                } else {
                    break;
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    4、原理

    原理是为每个线程创建变量副本,不同线程之间不可见,保证线程安全。每个线程内部都维护了一个 ThreadLocalMap,key 为 threadLocal 实例,value 为要保存的副本

    使用 ThreadLocal 会存在内存泄露问题,因为 key 为弱引用,而 value 为强引用,每次 GC 时 key 都会回收,而 value 不会被回收,所以一般使用 static 修饰 ThreadLocal,可以随时获取 value。为了解决内存泄漏问题,可以在每次使用完后删除 value

    二、ThreadLocal 与其他同步机制

    • ThreadLocal 与同步机制都是为了解决多线程中相同变量的访问冲突问题
    • ThreadLocal 并不能代替同步机制,两者面向的问题领域不同。同步机制是为了同步多个线程对相同资源的并发访问,是多个线程之间进行通信,并且协同的有效方式;而 ThreadLocal 是为了隔离多个线程的数据共享,从而避免多个线程之间对共享资源的竞争,也就不需要对多个线程进行同步了。ThreadLocal 采用以"空间换时间"的方法,其他同步机制采用以"时间换空间"的方式
    • ThreadLocal 适用的场景是,多个线程都需要使用一个变量,但这个变量的值不需要在各个线程间共享,各个线程都只使用自己的这个变量的值。这样的场景下,可以使用 ThreadLocal
  • 相关阅读:
    HTB靶场之Sandworm
    whisperspeech 英文TTS的实现
    Windows安装RabbitMQ详细教程
    使用.NET简单实现一个Redis的高性能克隆版(一)
    语法复习之C语言与指针
    Selenium+Pytest自动化测试框架
    增量表、全量表、拉链表的应用场景及优缺点详解
    React中插槽处理机制
    Code Complete 03 - 前期准备
    python标准模块----logging
  • 原文地址:https://blog.csdn.net/qq_46023503/article/details/134422912