美文网首页多线程并发编程系列教程
6.Thread Obturate(线程封闭)

6.Thread Obturate(线程封闭)

作者: Vander1991 | 来源:发表于2019-11-02 17:45 被阅读0次

概念:多线程中访问共享数据的时候会有线程间数据同步的问题,并不是所有时候都会用到共享数据,有些数据只需要在其线程内使用,数据就被封闭在各自的线程之中,就不需要同步,这种通过将数据封闭在线程中而避免使用同步的技术称为“线程封闭”。
线程封闭的具体实现:
1、ThreadLocal
2、局部变量

6.1 ThreadLocal

ThreadLocal是Java里的一种特殊的变量。
它是一个线程级别的变量,每个线程都有个ThreadLocal就是每个线程都拥有自己独立的一个变量,竞争条件被彻底消除,并发模式下是绝对安全的变量。
ThreadLocal<T> var = new ThreadLocal<T>();
会自动在每个线程上创建一个T的副本,副本之间彼此独立,互不影响。
可以用ThreadLocal存储一些参数,以便在线程中多个方法中使用,用来代替方法传参的做法。

6.1.1 ThreadLocal实例

public class ThreadLocalDemo {

    /**
     * threadLocal变量,每个线程都有一个副本,互不干扰
     */
    public static ThreadLocal<Bread> value = new ThreadLocal<>();

    public static void main(String[] args) throws Exception {
        producer1Thread();
        producer2Thread();
    }

    /**
     * threadlocal测试
     *
     * @throws Exception
     */
    public static Thread producer1Thread() throws Exception {
        Thread producer1Thread = new Thread(() -> {
            synchronized (value){
                System.out.println("producer1Thread: " + value.get());
                value.set(new Bread("producer1Bread", 10f));
                System.out.println("producer1Thread: " + value.get());
            }
        });
        producer1Thread.start();
        return producer1Thread;
    }

    /**
     * threadlocal测试
     *
     * @throws Exception
     */
    public static Thread producer2Thread() throws Exception {
        Thread producer2Thread = new Thread(() -> {
            synchronized (value){
                System.out.println("producer2Thread: " + value.get());
                value.set(new Bread("producer2Bread", 10f));
                System.out.println("producer2Thread: " + value.get());
            }
        });
        producer2Thread.start();
        return producer2Thread;
    }

    @Getter
    @Setter
    @AllArgsConstructor
    @ToString
    protected static class Bread {
        private String name;
        private float price;
    }

}

运行结果:

运行结果
从运行结果可以看出,两个线程间的ThreadLocal所存放的Bread是互不影响的,也就是说ThreadLocal变量是线程独立的。

6.2 局部变量

前面第1章节介绍过虚拟机栈,虚拟机栈中为每个线程分配一定的内存空间,每个线程的内存空间中有它们自己的栈帧(一个方法对应一个栈帧),栈帧中包括了局部变量表、操作数栈等信息,其它线程没法访问这个局部变量表。正因如此,局部变量也是栈封闭的一种形式

相关文章

  • 6.Thread Obturate(线程封闭)

    概念:多线程中访问共享数据的时候会有线程间数据同步的问题,并不是所有时候都会用到共享数据,有些数据只需要在其线程内...

  • 线程封闭

    线程封闭 对象封闭在一个线程里,这样线程也是安全的 如何实现 Ad-hoc 最糟糕 堆栈封闭:局部变量,无并发问题...

  • 线程封闭

    线程封闭 当访问共享的可变数据时,通常需要使用同步。一种避免使用同步的方式就是不共享数据。如果仅在单线程内访问数据...

  • 线程封闭

    把对象封装到一个线程里 Ad-hoc 线程封闭:程序控制实现,最糟糕,忽略 堆栈封闭:局部变量,无并发问题(局部变...

  • 线程封闭

    概述 多线程访问共享数据时,涉及到线程间数据同步问题。当场景不需要用到数据共享时,提出了线程封闭的概念,数据封闭在...

  • 线程封闭

    我们可以通过把对象设计成不可变对象来躲避并发,我们还可以通过使用线程封闭来实现线程安全,所谓线程封闭 就是将数据都...

  • 自定义过滤器和拦截器实现ThreadLocal线程封闭

    线程封闭 线程封闭一般通过以下三个方法: Ad-hoc线程封闭:程序控制实现,最糟糕,忽略 堆栈封闭:局部变量,无...

  • Java线程封闭

    线程封闭 多线程中不需要使用共享数据,使用数据封闭避免使用同步的技术 线程封闭的具体实现:ThreadLocal、...

  • ThreadLocal和InheritableThreadLoc

    什么是线程封闭 把对象封闭在一个线程里,即使这个对象不是线程安全的,也不会出现并发安全问题。实现线程封闭大致有三种...

  • 2020-02-02 3.1 线程封闭

    本文是Java线程安全和并发编程知识总结的一部分。 3.1 线程封闭 线程封闭的意思是: 只在线程内共享数据,不在...

网友评论

    本文标题:6.Thread Obturate(线程封闭)

    本文链接:https://www.haomeiwen.com/subject/oylhbctx.html