`
vortexchoo
  • 浏览: 67080 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

简单的 threadlocal 模拟 及测试

    博客分类:
  • java
 
阅读更多
package org.vic.demo.ThreadLocal.threadLocal;

import java.util.HashMap;
import java.util.Map;

public class MyThreadLocal {

	private static Map<Thread, Object> threadLocalPool = new HashMap<>();
	
	/**
	 * get duplicate object.
	 */
	public<T> T get() {
		Thread currentThread = Thread.currentThread();
		@SuppressWarnings("unchecked")
		T t = threadLocalPool.get(currentThread) == null ? null : (T) threadLocalPool.get(currentThread);
		return t;
	}

	/**
	 * set object to duplicate
	 */
	public <T>void set(T t) {
		Thread currentThread = Thread.currentThread();
		threadLocalPool.put(currentThread, t);
	}
	

        /**
        * remove thread and duplication from the pool
        */
	public void remove() {
		Thread thread = Thread.currentThread();
		threadLocalPool.remove(thread);
		System.out.println("thread " + thread.getName() + " has been removed!");
	} 
	
}

 

 

 

 

package org.vic.demo.ThreadLocal.test;

import java.util.Random;

import org.vic.demo.ThreadLocal.threadLocal.MyThreadLocal;

public class Test implements Runnable {
	
	private static MyThreadLocal threadLocal = new MyThreadLocal();
	
	public void doTest () {
		String currentThreadName = Thread.currentThread().getName();
		System.out.println("current thread name is " + currentThreadName);
		Random ran = new Random();
		int age = ran.nextInt(20);
		System.out.println(currentThreadName + " got age : " + age);
		Student stu = this.getStudenByThreadLocal();
		stu.setName(currentThreadName);
		stu.setAge(age);
		System.out.println("thread name (student name) is " + stu.getName() + " and age is " + stu.getAge());
		try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("thread name (student name) is " + stu.getName() + " and age is " + stu.getAge());
		threadLocal.remove();
	}
	
	public Student getStudenByThreadLocal () {
		Student stu = (Student) threadLocal.get();
		if (stu == null) {
			stu = new Student();
			threadLocal.set(stu);
		}
		return stu;
	}

	@Override
	public void run() {
		doTest();
	}
	
	public static void main(String[] args) {
		Test t = new Test();
		Thread thr1 = new Thread(t, "thr1");
		Thread thr2 = new Thread(t, "thr2");
		thr1.start();
		thr2.start();
	}
	
}

class Student {
	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;
	}
	
}

 

分享到:
评论

相关推荐

    servlet 模拟

    通过模拟Servlet,你可以创建一个简单的Servlet类并故意引入线程不安全的代码,然后通过并发测试来观察并修复这些问题。这将帮助你更好地理解Servlet的线程模型以及如何编写线程安全的代码。 在实践过程中,可以...

    Java并发编程实践-电子书-05章.pdf

    ### Java并发编程实践——第5章 数据冲突及诊断工具MTRAT #### 5.1 如何避免数据冲突 在并发编程中,数据冲突是指多个线程对同一资源的访问而导致的问题,这些问题可能会破坏程序的一致性和正确性。为了避免数据...

    Spring.3.x企业应用开发实战(完整版).part2

    16.3.1 模拟测试概述 16.3.2 创建Mock对象 16.3.3 设定Mock对象的期望行为及返回值 16.3.4 验证交互行为 16.4 测试整合之王Unitils 16.4.1 Unitils概述 16.4.2 集成Spring 16.4.3 集成Hibernate 16.4.4 集成Dbunit ...

    Spring3.x企业应用开发实战(完整版) part1

    16.3.1 模拟测试概述 16.3.2 创建Mock对象 16.3.3 设定Mock对象的期望行为及返回值 16.3.4 验证交互行为 16.4 测试整合之王Unitils 16.4.1 Unitils概述 16.4.2 集成Spring 16.4.3 集成Hibernate 16.4.4 集成Dbunit ...

    C#中的生成随机数代码

    在C#编程语言中,生成随机数是一项常见的任务,它在各种应用场景中都有用到,如游戏开发、模拟计算、测试用例生成等。本文将详细介绍如何在C#中生成随机数,以及几种不同的实现方式。 首先,让我们了解C#中最基础的...

    java常用词语例子以及解释

    `CommonUtil`可能是一个工具类,提供了如`inputKeys()`、`notNull()`等方法,用于输入模拟、断言非空等操作。 ```java HtmlTableCell cell = ...; String cellText = cell.getText(); ``` #### 线程局部变量与系统...

    自考 java 历年真题

    从2008年至2019年的真题集合,考生可以进行系统的复习和模拟练习,以提高对Java编程语言的理解和应用能力。 首先,Java语言的基础知识包括语法结构,如变量、常量、数据类型、运算符和控制流程语句(如if-else,...

    java笔试题180道

    【Java笔试题180道】是一套针对Core Java核心概念和编程技能的全面测试题集,旨在帮助学习者巩固和提升在Java领域的知识水平。这套试题覆盖了Java语言的基础语法、面向对象特性、异常处理、集合框架、多线程、输入/...

    廖雪峰python教程【完整版】.pdf

    - **8.4 文档测试**:文档测试是在代码文档中嵌入简单的测试用例,这些测试用例会被自动运行。 #### 9. IO编程 - **9.1 文件读写**:Python提供了丰富的文件操作接口,如打开、读取、写入和关闭文件等。 - **9.2 ...

    python多线程学习

    在`threading`模块中,还有其他辅助类,如`ThreadLocal`(线程局部存储),可以为每个线程存储独立的变量副本,避免了共享数据带来的问题。 与`thread`模块相比,`threading`模块提供了更多的功能,如命名线程、...

    java thread的教程

    此外,还将探讨更复杂的线程应用程序的基本构建块,如线程间的数据交换、线程控制及线程间的通信。 **适合读者:** 本教程面向那些具有良好的Java语言基础但对多线程或并发编程经验有限的程序员。完成本教程后,...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第一阶段36讲、自定义个简单的线程池并且测试.mp4 │ 高并发编程第一阶段37讲、给线程池增加拒绝策略以及停止方法.mp4 │ 高并发编程第一阶段38讲、给线程池增加自动扩充线程数量,以及闲时自动回收...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段36讲、自定义个简单的线程池并且测试.mp4 │ 高并发编程第一阶段37讲、给线程池增加拒绝策略以及停止方法.mp4 │ 高并发编程第一阶段38讲、给线程池增加自动扩充线程数量,以及闲时自动回收...

    Java学习笔记-个人整理的

    {1.11}简单算法}{38}{section.1.11} {1.11.1}打乱算法}{38}{subsection.1.11.1} {1.11.2}排序算法}{38}{subsection.1.11.2} {1.11.2.1}选择排序}{38}{subsubsection.1.11.2.1} {1.11.2.2}冒泡排序}{39}{...

    互联网创意产品众筹平台

    尚筹网-项目范围-项目简单介绍 │ 5. 尚筹网-人员组织结构-周期5 f: j* \5 W9 _ │ 6. 项目需求分析 │ 7.物理数据模型(PDM) -- 数据库设计 (PowerDesigner) │ 8.UML建模语言,-开发设计工具Rational_Rose │ 9...

Global site tag (gtag.js) - Google Analytics