`
Jeff88
  • 浏览: 4553 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

线程安全类三:变量的共享范围ThreadLocal的使用

 
阅读更多
package com.itmayiedu.thread;

import java.util.concurrent.atomic.AtomicInteger;

/*
 * 使用AtomicInteger达到线程的安全
 * 
 * */
/*class ResNumber{
	
	public AtomicInteger  count = new AtomicInteger(0) ;
	
	public  String getNumber() {
		count.incrementAndGet();
		return count.get() + "" ;
	}
	
}

class LocalThreadDemo extends Thread {
	
	private ResNumber resNumber ;
	
	public LocalThreadDemo(ResNumber resNumber) {
		super();
		this.resNumber = resNumber;
	}


	@Override
	public void run() {
			for (int i = 0; i < 3; i ++) {
				System.out.println(getName()+"," + resNumber.getNumber() );
			}
	}
	
}
*/


/*
 * 使用synchronized同样达到线程安全的效果,需要正确的位置上添加合适的锁,这个是
 * 简单的例子,
 * 越复杂越考验设置锁的艺术性
*/
class ResNumber{
	
	public int  count = 0 ;
	
	public static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>() {
		
		@Override
		protected Integer initialValue() {
			return 0 ;
		}
		
	} ;
	
	public synchronized String getNumber() {
		count = threadLocal.get() + 1 ;
		threadLocal.set(count);
		return count + "" ;
	}
	
}

class LocalThreadDemo extends Thread {
	
	private ResNumber resNumber ;
	
	public LocalThreadDemo(ResNumber resNumber) {
		super();
		this.resNumber = resNumber;
	}


	@Override
	public void run() {
		synchronized(this) {
			for (int i = 0; i < 3; i ++) {
				System.out.println(getName()+"," + resNumber.getNumber() );
			}
		}
	}
	
}




public class ThreadLocalDemo1 {

	public static void main(String[] args) {
		
		/*
		 * 三个线程公用同一个对象,对象中的变量会累积
		 * AtomicInteger:具有原子性,保证线程的安全    增加:incrementAndGet  取值:get
		 * volatile:虽然可以保证线程间变量的可见性,但不保证具有原子性,属于线程不安全的操作,建议少用
		 * 普通基本数据类型要想保持线程的安全,需要使用synchronized同步锁;而且可能不止一个地方,需要多个
		 * 地方添加,才可能达到目的
		 * 
		 * */
		
		
		ResNumber resNumber = new ResNumber() ;
		LocalThreadDemo th1 = new LocalThreadDemo(resNumber) ;
		th1.setName("线程1");
		LocalThreadDemo th2 = new LocalThreadDemo(resNumber) ;
		th2.setName("线程2");
		LocalThreadDemo th3 = new LocalThreadDemo(resNumber) ;
		th3.setName("线程3");
		th1.start();
		th2.start();
		th3.start();
		
	}

}

 

如果想多个对象共享该变量:设置为static

如果是同一个对象分多个线程去跑:设置为基本类型即可

如果同一个对象多个线程访问而线程间独自享有一个私有变量,相互间不影响,可以用ThreadLoca类

 

变量范围大小:static对象(所有的对象所共享> static对象所拥有的>ThreadLocal线程间独立存在

 

 

 

 

 

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Java非线程安全类变线程安全类.pdf

    非线程安全类的例子可以是 NotThreadSafe 类,该类有一个共享变量 state,当多个线程使用同一个 NotThreadSafe 类的一个对象时,也会共享该对象的 state 属性,故是非线程安全的。 但是,通过一些改造也可以将非...

    18 线程作用域内共享变量—深入解析ThreadLocal.pdf

    【线程作用域内共享变量】 在Java并发编程中,线程...总之,`ThreadLocal`是一个强大的工具,适用于在特定线程内创建独立的变量副本,从而解决线程安全问题。但使用时需谨慎,合理利用,避免滥用和潜在的内存泄漏问题。

    java中ThreadLocal类的使用

    Java中的`ThreadLocal`类是一个非常实用的工具,它提供了线程局部变量的功能。线程局部变量意味着每个线程都拥有自己独立的变量副本,互不干扰,这在多线程编程中尤其有用,可以避免数据共享带来的同步问题。下面...

    java多线程_java多线程下变量共享_

    Java并发包(`java.util.concurrent.atomic`)提供了如`AtomicInteger`、`AtomicLong`等原子类,它们提供了原子操作,如`incrementAndGet()`,在多线程环境下可以替代`synchronized`和`volatile`,实现高效且线程安全...

    多线程线程变量赋值

    然而,需要注意的是,线程局部变量并不是线程安全的解决方案。如果你需要在线程间共享数据,并确保数据的一致性,那么应该使用其他同步机制,如`synchronized`关键字、`java.util.concurrent`包中的原子类或`...

    ThreadLocal

    - 不适用于跨线程通信:ThreadLocal只保证同一线程内的数据隔离,不同线程间无法共享ThreadLocal变量。 - 不是线程安全的:尽管ThreadLocal提供了线程隔离,但它本身并不保证线程安全性,如果在`set`和`get`操作之间...

    简单分析Java线程编程中ThreadLocal类的使用共

    它本身不会引发线程安全问题,但由于它的使用通常涉及共享对象,如果这些对象在多个线程之间共享,那么仍需关注线程安全性。 此外,ThreadLocal在长时间运行的系统中可能会导致内存泄漏。当线程存活时间过长,而...

    局部变量线程安全测试

    测试可能包括对局部变量的读写操作,以及涉及到同步机制如synchronized关键字,volatile修饰符,或者是使用ThreadLocal等技术来确保线程安全。 在标签中,“局部变量”、“线程”、“安全”、“测试”和“源码”是...

    ThreadLocal 线程本地变量 及 源码分析.rar_开发_设计

    - ThreadLocal并不是解决所有线程安全问题的万能药,它主要用于隔离线程间的变量状态,而非同步控制。 - 不要将ThreadLocal用作全局变量,因为它们只在创建它们的线程内有效,无法跨线程共享。 - 谨慎处理生命...

    ThreadLocal应用示例及理解

    **线程局部变量(ThreadLocal)是Java编程中一个非常重要的工具类,它在多线程环境下提供了线程安全的数据存储。ThreadLocal并不是一个变量,而是一个类,它为每个线程都创建了一个独立的变量副本,使得每个线程都...

    ThreadLocal简单Demo

    在Java编程中,`ThreadLocal`是一个非常重要的工具类,它用于在多线程环境中提供线程安全的局部变量。`ThreadLocal`并不是一个线程,而是一个线程局部变量的容器,每个线程都有自己的副本,互不干扰。这使得线程间的...

    Java ThreadLocal详解_动力节点Java学院整理

    3. 线程安全:ThreadLocal可以解决多线程编程中的线程安全问题,但是需要正确地使用ThreadLocal来避免线程安全问题。 ThreadLocal是一种非常有用的机制,可以解决多线程编程中的线程安全问题,但是需要正确地使用...

    Java中ThreadLocal的设计与使用

    理解ThreadLocal的工作原理和使用方法对于编写高效、安全的多线程程序至关重要。 ### ThreadLocal简介 ThreadLocal并非一个线程对象,而是一个线程局部变量的容器。每个线程都有自己的ThreadLocal实例,它们各自...

    servlet与Struts action线程安全问题分析

    1. **避免使用实例变量**:尽可能使用局部变量,局部变量只存在于方法的执行上下文中,不会被多个线程共享,因此不存在线程安全问题。 2. **使用同步控制**:通过`synchronized`关键字对关键代码块或方法进行同步,...

    java线程安全测试

    8. 线程局部变量(ThreadLocal):为每个线程创建独立的变量副本,避免了线程安全问题,但要注意,ThreadLocal变量会在线程结束时被垃圾回收,如果不及时清理可能导致内存泄漏。 测试线程安全通常包括模拟并发环境...

    ThreadLocal原理及在多层架构中的应用

    ThreadLocal不是一种数据结构,而是一种解决线程间共享数据的方式,它提供了线程安全的局部变量。** ### 1. ThreadLocal的原理 ThreadLocal的工作原理主要基于以下几点: - **内部类ThreadLocalMap**:...

    JAVA ThreadLocal类深入

    Java中的ThreadLocal类是一种线程绑定机制,用于在多线程环境中为每个线程提供独立的变量副本,避免了线程间的数据共享带来的并发访问问题。ThreadLocal并不是一个线程对象,而是线程局部变量,即...

    正确理解ThreadLocal

    2. **线程安全**:ThreadLocal并不解决变量的线程安全问题,它仅仅是实现了线程间的隔离,而不是保护。 3. **线程局部性**:ThreadLocal的变量只存在于当前线程,跨线程无法访问,不适合需要跨线程共享数据的场景。...

Global site tag (gtag.js) - Google Analytics