`

多线程,volatile,threadLocal

阅读更多

线程在程序中是独立的,并发的执行路径,每个线程都有自己的堆栈,自己的局部变量,程序计数器
  一个进程中的多个线程共享相同的内存地址空间,这就意味着他们可以访问相同的变量和对象,而且他们从同一堆

中分配对象,尽管这让线程之间共享信息变得很容易,但是应该确保他们不会妨碍同一进程中的其他线程,确保相互之间不会干扰。


threadlocal是在进程地址空间存储的,但是它只与某线程绑定,其他线程不知道怎样访问。

每个 Java 程序都至少有一个线程 ― 主线程。当一个 Java 程序启动时,JVM 会创建主线程,并在该线程中调用程序的 main() 方法。


JVM 还创建了其它线程,您通常都看不到它们 ― 例如,与垃圾收集、对象终止和其它 JVM 内务处理任务相关的线程。其它工具也创建线程,如 AWT(抽象窗口工具箱(Abstract Windowing Toolkit))或 Swing UI 工具箱、servlet 容器、应用程序服务器和 RMI(远程方法调用(Remote Method Invocation))。

 

volatile(不稳定的)关键字修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值写回到共享内存。这样,在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
JAVA语言规范中指出,为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。这样,当多个线程同时与某个对象交互时,就必须注意 要让线程及时得到共享成员变量的变化。

而,volatile关键字就提示JVM,对于这个成员变量,线程不能保存它的私有拷贝而应直接与共享成员变量交互。

使用建议:在两个或者更多线程访问的成员变量上使用volatile,当要访问的变量已在synchronized代码块中,或者为常量时,不必

使用。
由于使用volatile屏蔽掉了VM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字。

分享到:
评论

相关推荐

    C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例),可直接运行

    - `volatile`关键字:确保多线程环境下的变量读取始终是最新的值,避免缓存导致的问题。 - `Interlocked`类:提供原子操作,如增加、减小、交换等,避免竞态条件。 5. **异步编程模型**:C#从4.0版本开始引入了...

    java多线程的讲解和实战

    - `volatile`关键字:用于标记共享变量,确保多线程环境下的可见性和有序性,但不保证原子性。 - `join()`方法:让当前线程等待另一个线程完成其执行。 4. **线程优先级与调度**:Java的`Thread`类提供了设置线程...

    多线程面试题

    volatile确保了多线程环境下的变量可见性和有序性,但不保证原子性。 5. **死锁**:当两个或更多线程互相等待对方释放资源时,就会发生死锁。避免死锁的方法包括避免循环等待、设置超时、使用死锁检测算法等。 6. ...

    java 多线程编程实战指南(核心 + 设计模式 完整版)

    - **同步机制**:包括`synchronized`关键字、`volatile`关键字、`Lock`接口及其子类,用于解决多线程环境中的数据一致性问题。 2. **并发控制** - **互斥与同步**:通过`synchronized`关键字实现临界区的互斥访问...

    多线程终极案例程序(多线程进阶)

    Java中的`volatile`关键字、`Atomic`类和`ThreadLocal`变量可以帮助我们在多线程环境下正确地管理共享状态,防止数据不一致和竞态条件。 最后,性能优化也是多线程编程的重要一环。通过合理调度线程、避免不必要的...

    java多线程设计

    3. 线程同步:Java提供了多种同步机制,如synchronized关键字、volatile变量、Lock接口(ReentrantLock等)、Semaphore信号量、CyclicBarrier屏障等,用于解决多线程环境下资源竞争和数据一致性问题。 二、不可变...

    多线程的学习资料(对初学者特别有用)!

    为了实现线程安全,我们需要使用原子操作、 volatile关键字、ThreadLocal变量或者通过同步机制(如synchronized和Lock)来保护共享资源。 本学习资料包将覆盖以上所述的多线程基础、线程池原理、并发工具的使用以及...

    Java多线程的总结

    Java多线程是Java编程中的一个核心概念,它在现代软件开发中扮演着至关重要的角色。多线程允许程序同时执行多个任务,提高了系统资源的利用率,提升了应用程序的响应速度和并发性能。对于大型分布式系统、Web应用...

    java单线程多线程clientserver

    Java中的单线程和多线程是编程中的关键概念,特别是在服务器端开发中。了解它们的原理和应用对于构建高效、可扩展的客户端-服务器应用至关重要。以下是对这些概念的详细解析。 首先,我们来谈谈单线程。在Java中,...

    JAVA 多线程的PPT和示例

    volatile关键字用于确保共享变量的可见性和有序性,避免指令重排序对多线程造成的影响。 此外,Java提供了ThreadLocal变量,它为每个线程都提供了一个独立的变量副本,避免了线程间的数据共享,简化了并发编程。...

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

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

    很详细的C#多线程编程方面的知识

    C#的`volatile`关键字可以确保变量对所有线程都是可见的,而`ThreadLocal<T>`类则用于创建每个线程都有的本地存储。 最后,理解并掌握线程池(`ThreadPool`)的工作原理也很重要。线程池可以有效管理线程资源,避免...

    java多线程面试题和答案

    在Java编程领域,多线程是一项至关重要的技术,特别是在开发高效、响应迅速的应用程序时。以下是一些关于Java多线程的面试题及其答案,涵盖了基础概念、并发控制、线程安全以及性能优化等方面。 1. **什么是Java多...

    JAVA多线程的一个带UI界面的例子

    Java提供了`synchronized`关键字、volatile变量、ThreadLocal等机制来保证线程安全。 3. **线程通信**:在多线程环境下,线程间需要进行通信,例如,通过`wait()`, `notify()`, `notifyAll()`方法来协调线程的执行...

    自己总结的多线程

    ### 多线程基础 #### 1. 多线程概念 多线程是指在一个程序中包含多个控制流,它们可以并发执行不同的任务。在Java中,多线程的实现通常借助于`Thread`类或实现`Runnable`接口。多线程能够提高CPU的利用率,改善应用...

    C#.NET多线程实例25个,文档6篇

    `volatile`关键字、`readonly`修饰符以及`ThreadLocal<T>`类都是保证线程安全的方式。 6篇文档可能涵盖了线程生命周期、线程池的使用、同步原语、线程间通信、异步编程的最佳实践等内容,通过学习这些实例和文档,...

    java多线程编程实例_Source

    实例中可能涵盖常见线程安全问题,如数据竞争、死锁、活锁和饥饿,以及如何通过使用volatile、Atomic变量、线程局部变量(ThreadLocal)等手段来解决这些问题。 六、线程中断与异常处理 Java的Thread类提供了...

    Java多线程实例代码

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应性。在Java中,实现多线程有两种主要方式:通过继承`Thread`类和实现`Runnable`接口。 1. 继承Thread类: 当你需要创建一...

    浅谈JAVA中多线程的实现.zip

    5. volatile关键字:用于确保多线程环境下的可见性和有序性,但不保证原子性。如果一个变量被volatile修饰,那么所有线程都会看到最新修改的值。 6. Lock接口和ReentrantLock类:提供了比synchronized更精细的锁...

    Java多线程知识,龙果学院

    在Java编程领域,多线程和并发编程是至关重要的概念,尤其对于中级Java开发者来说,理解和掌握这些知识是提升技术水平的关键。"Java多线程知识,龙果学院"这一课程显然是针对这部分内容进行深入讲解的资源,旨在帮助...

Global site tag (gtag.js) - Google Analytics