`
wynet321
  • 浏览: 26371 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ThreadLocal与线程私有变量的不同

    博客分类:
  • JAVA
阅读更多

线程变量在以下情况下是安全的:

1. 线程私有变量:每一个线程都是独立的生成实例。例如:

count是TestRunable的私有变量,a和b都是独立的线程实例,count是线程安全的。

public class TestRunable implements Runnable {
	private int count=0;
	@Override
	public void run() {
        ...
	}
}

public static void main(String[] args) {
	Thread a = new Thread(new TestRunable());
	Thread b = new Thread(new TestRunable());
    a.start();
    b.start();
}

 同样是TestRunable,a和b利用同一个Runable实例生成线程,则count为线程不安全的。

public class TestRunable implements Runnable {
	private int count=0;
	@Override
	public void run() {
       ...
	}
}

public static void main(String[] args) {
	TestRunable runable=new TestRunable();
	Thread a = new Thread(runable, "a");
	Thread b = new Thread(runable, "b");
    a.start();
    b.start();
}

 

2. run方法的局部变量。如下count是线程安全的。

public class TestRunable implements Runnable {
	@Override
	public void run() {
        int count=0;
        ...
	}

}

 

3. ThreadLocal声明的变量。如下count是线程安全的。

public class TestRunable implements Runnable {
	private ThreadLocal<Integer> count = new ThreadLocal<Integer>();
	@Override
	public void run() {
		...
	}
}

 最后,举个ThreadLocal的实例:

public class TestRunable implements Runnable {
	private ThreadLocal<Integer> count = new ThreadLocal<Integer>();
	@Override
	public void run() {
		if(count.get()==null){
			count.set(0);
		}
		while (count.get().intValue()< 10) {
			count.set(count.get().intValue()+1);
			try {
				Thread.sleep(new Random().nextInt(3000));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("Thread" + Thread.currentThread().getName() + " Count:" + count.get().intValue());
		}
	}
}

 

public class ThreadTest {
	public static void main(String[] args) {
		TestRunable runable=new TestRunable();
		Thread a = new Thread(runable, "a");
		Thread b = new Thread(runable, "b");
		a.start();
		b.start();
	}
}

 结果输出证明count是线程安全的,两个线程输出结果都是从1到10:

Threada Count:1

Threada Count:2

Threadb Count:1

Threada Count:3

Threadb Count:2

Threada Count:4

Threada Count:5

Threadb Count:3

Threada Count:6

Threadb Count:4

Threada Count:7

Threadb Count:5

Threada Count:8

Threada Count:9

Threadb Count:6

Threadb Count:7

Threada Count:10

Threadb Count:8

Threadb Count:9

Threadb Count:10

分享到:
评论

相关推荐

    多线程线程变量赋值

    总的来说,“多线程线程变量赋值”是一个关于如何在多线程环境中管理线程私有数据的问题。通过`ThreadLocal`,我们可以创建和操作线程特有的变量,避免了数据同步的复杂性,但在使用过程中需要注意内存管理和线程...

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

    - 使用`ThreadLocal`存储线程私有数据,避免全局变量的干扰。 理解并掌握Java多线程下变量共享的原理和解决方案,有助于编写出高效、稳定的并发程序。在实际开发中,应结合具体业务场景选择合适的同步机制,以达到...

    ThreadLocal应用示例及理解

    **线程局部变量(ThreadLocal)是Java编程中一个非常重要的工具类,它在多线程环境下提供了线程安全的数据存储。...在Java并发编程中,ThreadLocal是一个不可或缺的工具,尤其在需要线程私有数据的场景下。

    Java中ThreadLocal的设计与使用

    这使得ThreadLocal适合于存储线程私有数据,如数据库连接、用户会话信息等。 ### ThreadLocal的最佳实践 1. **避免过度使用**:虽然ThreadLocal方便,但过度依赖可能导致设计复杂,不易维护。应优先考虑其他同步...

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

    通常,我们将`ThreadLocal`声明为`static final`的私有变量,并提供静态的`set`和`get`方法,例如: ```java public class OperationInfoRecorder { private static final ThreadLocal&lt;OperationInfoDTO&gt; THREAD_...

    Java多线程 之 临界区、ThreadLocal.docx

    ThreadLocal通常用于存储线程私有的配置或状态信息。 下面是一个简单的ThreadLocal示例: ```java public class ThreadLocalTest { private static ThreadLocal&lt;Integer&gt; threadLocal = new ThreadLocal() { ...

    java中ThreadLocal详解

    在Java多线程编程中,`ThreadLocal`是一个非常重要的工具类,它提供了一种在每个线程内部存储线程私有实例的方法。通常情况下,当多个线程共享某个变量时,可能会引发线程安全问题。而`ThreadLocal`则提供了另一种...

    正确理解ThreadLocal

    2. **作用**:ThreadLocal主要用在多线程环境下,为每个线程提供独立的、线程私有的变量副本,避免了线程间的数据共享带来的同步问题,提高了并发性能。 **二、ThreadLocal的工作原理** 1. **内存模型**:每个...

    ThreadLocal那点事儿编程开发技术共6页.pdf

    3. **线程局部变量的优势**:ThreadLocal使得每个线程可以拥有自己的变量副本,这对于实现线程安全的缓存或者线程私有的配置信息非常有用。例如,Servlet容器中的每个请求通常都在一个单独的线程中处理,ThreadLocal...

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

    这样,即使在线程池环境下,每次任务执行时使用的就是线程私有的变量,不会产生线程安全问题。 在Java中,一个无状态的Bean(比如只有方法没有实例变量的类)是线程安全的,因为它不存储任何线程共享的状态。而有...

    Synchronized与ThreadLocal

    - ThreadLocal 维护了一个 Map 结构,其中 Key 是 ThreadLocal 对象本身,Value 是线程私有的值。 - 每个线程都拥有自己的 ThreadLocal 实例,这些实例是相互独立的,因此不存在线程安全问题。 - **使用场景:** ...

    JAVA并发-自问自答学ThreadLocal.pdf

    - **状态隔离**:在多线程环境中,ThreadLocal可以用来存储线程的私有数据,如用户ID、事务ID等,确保这些数据在不同线程间互不影响。 - **简化共享对象的管理**:ThreadLocal可以避免在多线程中使用共享对象导致...

    Android 详解ThreadLocal及InheritableThreadLocal

    这意味着每个线程都拥有ThreadLocal变量的私有实例,它们之间互不干扰。在Android中,ThreadLocal常被用来存储线程相关的数据,例如Handler中的Looper对象,因为Looper与线程紧密关联,每个线程通常只有一个Looper,...

    ThreadLocal

    ThreadLocal不是一种同步机制,而是通过为每个线程创建变量的私有副本来避免线程安全问题,因此,它在多线程编程中提供了一种非常便捷且高效的数据管理方式。 在传统的多线程编程中,如果多个线程需要访问和修改同...

    Quartz-ThreadLocal.rar

    2. **避免并发冲突**:如果一个任务在执行过程中需要使用一些共享资源,但又不希望引入锁或同步机制,可以考虑使用 ThreadLocal 来存储每个线程的私有实例。 3. **状态传递**:在 Quartz 作业的执行过程中,...

    设计模式及ThreadLocal资料

    ThreadLocal是Java中的一个线程局部变量,它为每个线程都提供了一个独立的变量副本,各个线程可以独立地改变自己的副本,而不会影响其他线程。ThreadLocal常用于解决多线程环境下数据隔离的问题,例如HTTP请求上下文...

    JAVA线程第三版

    7. **线程局部变量**:ThreadLocal提供线程私有的变量副本,避免了共享数据带来的同步问题。 8. **并发设计模式**:书中还探讨了各种并发设计模式,如生产者消费者模型、读写锁等,这些都是解决多线程问题的常用...

    Java ThreadLocal类应用实战案例分析

    * ThreadLocal变量的副本是线程私有的,每个线程都可以独立地改变自己的副本。 * ThreadLocal变量的访问是线程安全的,不需要使用同步机制来保护变量的访问。 Java ThreadLocal类提供了一种简单而有效的方式来实现...

    多线程相关代码(V3)

    线程局部变量可以视为每个线程的私有变量,不同线程间无法直接访问对方的ThreadLocal变量。 5. **Executors框架**: Java的`java.util.concurrent.ExecutorService`和`java.util.concurrent.Executors`类提供了...

Global site tag (gtag.js) - Google Analytics