java的ThreadLocal类的用法

java的ThreadLocal类的用法,ThreadLocal是一个支持泛型的类,用在多线程中用于防止并发冲突问题。

例如下面的一个例子,就是用于线程增加1,但是相互不冲突

package com.test.threadlocal;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

class Local
{
	private static ThreadLocal<Integer> num=new ThreadLocal<Integer>()
			{
				protected synchronized Integer initialValue()
				{
					return 1;
				}
			};

	public static void add()
	{
		num.set(num.get()+1);
	}
	public static int get()
	{
		return num.get();
	}
}

class SelfThread extends Thread
{
	public void run()
	{
		for(int i=0;i<1000;i++)
		{
			System.out.println(this.getName()+"  "+Local.get());
			this.yield();
			Local.add();
		}
	}
}
public class MyThreadLocal {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ExecutorService exec=Executors.newCachedThreadPool();
		for(int i=0;i<5;i++)
		{
			exec.execute(new SelfThread());
		}

		exec.shutdown();
	}

}

输出结果

Thread-3  973

Thread-1  808

Thread-3  974

Thread-1  809

Thread-3  975

Thread-1  810

Thread-3  976

Thread-1  811

Thread-3  977

Thread-1  812

Thread-3  978

Thread-1  813

Thread-3  979

Thread-1  814

Thread-3  980

Thread-1  815

Thread-3  981

Thread-1  816

Thread-3  982

Thread-1  817

Thread-3  983

Thread-1  818

Thread-3  984

Thread-1  819

Thread-3  985

Thread-1  820

Thread-3  986

Thread-1  821

Thread-3  987

Thread-1  822

Thread-3  988

Thread-1  823

Thread-3  989

Thread-1  824

Thread-3  990

Thread-1  825

Thread-3  991

Thread-1  826

Thread-3  992

Thread-1  827

Thread-3  993

Thread-1  828

Thread-3  994

Thread-1  829

Thread-3  995

Thread-1  830

Thread-3  996

Thread-1  831

Thread-3  997

Thread-1  832

Thread-3  998

Thread-1  833

Thread-3  999

Thread-1  834

Thread-3  1000

Thread-1  835

Thread-1  836

Thread-1  837

Thread-1  838

Thread-1  839

Thread-1  840

Thread-1  841

Thread-1  842

Thread-1  843

Thread-1  844

Thread-1  845

Thread-1  846

Thread-1  847

Thread-1  848

Thread-1  849

Thread-1  850

Thread-1  851

Thread-1  852

Thread-1  853

Thread-1  854

Thread-1  855

Thread-1  856

Thread-1  857

Thread-1  858

Thread-1  859

Thread-1  860

Thread-1  861

Thread-1  862

Thread-1  863

Thread-1  864

Thread-1  865

Thread-1  866

Thread-1  867

Thread-1  868

Thread-1  869

Thread-1  870

Thread-1  871

Thread-1  872

Thread-1  873

Thread-1  874

我们发现,线程会相互切换,但是每个线程都保持了增加1的顺序,说明没有线程之间的相互干扰。

时间: 2025-01-01 21:11:13

java的ThreadLocal类的用法的相关文章

深入研究java.lang.ThreadLocal类

深入研究java.lang.ThreadLocal类 一.概述 ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量).也许把它命名为ThreadLocalVar更加合适.线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是Java中一种较为特殊的线程绑定机制,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副

Java中Class类及用法

Java中Class类及用法 Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识,即所谓的RTTI.这项信息纪录了每个对象所属的类.虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是Class类.Class类封装一个对象和接口运行时的状态,当装载类时,Class类型的对象自动创建. 说白了就是: Class类也是类的一种,只是名字和class关键字高度相似.Java是大小写敏感的语言. Class类的对象内容是你创建的类的类型信息,比如你创建

浅谈对Java中ThreadLocal类的理解

首先要明确:ThreadLocal不是一个多线程类,或者应该叫做线程局部变量.这从ThreadLocal的JDK定义中就可以看到 public class ThreadLocal<T>extends Object 可以看出ThreadLocal只是一个普普通通的类,并没有继承自Thread或实现Runnable接口. 同时也可以看到ThreadLocal使用了泛型,这样他就可以操作几乎任何类型的数据了.下面说JDK API代码时具体再说. 对此类,看看JDK API中的部分描述: 该类提供了线

Java多线程——ThreadLocal类

一.概述 ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量).也许把它命名为ThreadLocalVar更加合适.线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是Java中一种较为特殊的线程绑定机制,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突. 从线程的角度看,每个线程都保持一个对其线程局

java.lang.ThreadLocal类

一.概述 ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量).也许把它命名为ThreadLocalVar更加合适.线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是Java中一种较为特殊的线程绑定机制,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突. 从线程的角度看,每个线程都保持一个对其线程局

java.math.BigDecimal类的用法

在java中提供了大数字的操作类,即java.math.BinInteger类和java.math.BigDecimal类.这两个类用于高精度计 算,其中BigInteger类是针对大整数的处理类,而BigDecimal类则是针对大小数的处理类.下边我们介绍BigDecimal类: BigDecimal的实现利用到了BigInteger,不同的是BigDecimal加入了小数的概念.一般的float型和Double型数据只可 以用来做科学计算或者是工程计算,由于在商业计算中,要求的数字精度比较高

java面向对象-------String类基本用法

package cn.zxg.oop; /** * 测试string类的用法,不能被重写 */ public class TestString { String a; public static void main(String[] args) { String str="abc"; String str2=new String("def"); String str3="abc"+"def"; String str4=&quo

java之常用类的用法

知识点: 包装类基本知识 JAVA并不是纯面向对象的语言.Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的. 但是我们在实际使用中经常需要将基本数据转化成对象,便于操作.比如:集合的操作中. 例如使用Map对象要操作put()方法时,需要传入的参数是对象而不是基本数据类型. 为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为包装类(Wrapper Class). 1)定义:将基本类型封装成类,其中包含属性和

ThreadLocal类的用法与源码解析

首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的.各个线程中访问的是不同的对象. 另外,说ThreadLocal使得各线程能够保持各自独立的一个对象,并不是通过ThreadLocal.set()来实现的,而是通过每个线程中的new 对象 的操作来创建的对象,每个线程创建一个,不是什么对象的拷贝或副本.通过ThreadLocal.set()将这个新创建