现在的位置: 首页 > 综合 > 正文

线程学习之线程本地存储

2018年02月05日 ⁄ 综合 ⁄ 共 1267字 ⁄ 字号 评论关闭

线程本地存储是解决多个线程共享一个资源(资源共享)的另一种方式。它相当于一个Map<Thread, Object>, 把一个线程和它的状态(数据)关联起来。

上代码微笑

package com.lyj;

/**
 * 防止多个线程共享一个资源-----去除对变量的共享
 * 线程本地存储  java.lang.ThreadLocal类,相当于一个Map<Thread, Object>
 * 
 */
import java.util.Random;

public class ThreadLocalDemo {
    private static ThreadLocal<Integer> value = new ThreadLocal<Integer>();
    private static ThreadLocal<MyInfo> myInfoData = new ThreadLocal<MyInfo>();

    public static void main(String[] args) {
        
        //产生2个线程
        for (int i = 0; i < 2; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    int data = new Random().nextInt();
                    System.out.println(Thread.currentThread().getName() + "   " + data);
                    // 保存当前线程的数据
                    // 相当于一个Map;
                    value.set(data);

                    // 保存一个打包的对象
                    // 存放多个数据
                    MyInfo myInfo = new MyInfo();
                    myInfo.setName("lyj");
                    myInfo.setAge(20);
                    myInfoData.set(myInfo);

                    new A().get();
                    //new B().get();
                }
            }).start();
        }
    }

    static class A {
        private static void get() {
            int data = value.get();

            MyInfo myinfo = myInfoData.get();
            System.out.println("A " + Thread.currentThread().getName() + "   " + data + "  " + myinfo.getName() + "  "
                    + myinfo.getAge());
        }
    }

    static class B {
        private static void get() {
            int data = value.get();
            System.out.println("B " + Thread.currentThread().getName() + "   " + data);
        }
    }

    static class MyInfo {
        private String name;
        private int age;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

    }
}
【上篇】
【下篇】

抱歉!评论已关闭.