zoukankan      html  css  js  c++  java
  • JAVA并发编程7_线程封闭:ThreadLocal类

    多线程访问共享数据时,通常需要同步,一种避免使用同步的方式就是不共享数据。如果仅在单线程里访问数据,那么就不需要使用同步,这种技术被称为线程封闭。

    Ad-hoc线程封闭:维护线程封闭性的职责完全由程序实现来承担。

    栈封闭:我的理解就是局部变量,局部变量是线程私有的,不会被共享,也就不存在竞争问题。因此能使用局部变量的地方就不要使用全局变量。

    ThreadLocal类:一种维护线程封闭性更规范的方法。顾名思义就是创建一个线程局部变量。它会为使用相同变量的每个不同线程都创建不同存储。我的理解是在使用全局的变量(多线程均可能同时访问的变量)的前提下,多个线程同时去访问该变量,一般会出现线程不安全,而此时我们又不需要共享该变量,就可以使用ThreadLocal类来解决。

    实际上,ThreadLocal根本就不是解决共享变量的问题,线程之间根本就不会共享变量,一定要注意ThreadLocal是用来隔离线程存储数据的。

    public class Test implements Runnable{
    	private ThreadLocal<Integer> num = new ThreadLocal<Integer>(){
    		protected Integer initialValue() {
    			return 100;
    		};
    	};
    	
    	@Override
    	public void run() {
    		while (!Thread.currentThread().isInterrupted()) {
    			increment();
    			System.out.println(Thread.currentThread().getName() + "  " + num.get());
    			Thread.yield();
    		}
    	}
    	
    	private void increment() {
    		num.set(num.get() + 1);
    	}
    
    	public static void main(String[] args) throws InterruptedException {
    		Test test = new Test();
    		ExecutorService exec = Executors.newCachedThreadPool();
    		for (int i = 0; i < 5; i++) {
    			exec.execute(test);
    		}
    		TimeUnit.MILLISECONDS.sleep(5);
    		exec.shutdownNow();
    	}
    }
    
    输出
    pool-1-thread-2  101
    pool-1-thread-1  101
    pool-1-thread-4  101
    pool-1-thread-3  101
    pool-1-thread-5  101
    pool-1-thread-4  102
    pool-1-thread-1  102
    pool-1-thread-3  102
    pool-1-thread-2  102
    pool-1-thread-5  102
    pool-1-thread-1  103
    pool-1-thread-4  103
    pool-1-thread-3  103
    pool-1-thread-2  103
    pool-1-thread-5  103
    pool-1-thread-1  104
    pool-1-thread-4  104
    pool-1-thread-3  104
    pool-1-thread-2  104
    pool-1-thread-5  104
    …

    程序运行时,很显然每个线程都被分配了自己的存储。如果不是使用ThreadLocal类,那这五个线程共享的是num变量,必然会产生线程不安全产生竞争。

  • 相关阅读:
    IT战略规划项目方法论(转)
    008_Node中的require和import
    007_Mac上安装Node和NPM
    005_讨论多线程和单线程
    006_饿了么大前端总监sofish帮你理清前端工程师及大前端团队的成长问题!
    005_解密饿了么大前端团队
    005_python对整数的拼接
    010_动态语言与鸭子类型及python2和3的区别
    010_vim和python整合开发
    009_一行python重要工具
  • 原文地址:https://www.cnblogs.com/qhyuan1992/p/5385296.html
Copyright © 2011-2022 走看看