`
wkf41068
  • 浏览: 457820 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论
阅读更多
   对于这一问题的思考来源于在Oracle  EBS 的一次面试,面试题中有如下一道题:
13. Which of the following data elements are considered thread-safe?
A. Local variables    B. Static varriables
C. Class variables    D. Instance variables

上面的问题之前没有考虑过,所以就得查询资料,补充相关知识。


   是否存在线程安全问题,首要考虑的是是否存在数据共享的问题(即多个线程同时操作某一资源的场景),再接着考虑怎样解决线程安全与否。

(1)静态变量:线程非安全。
    静态变量即类变量,位于方法区,为所有对象共享,共享一份内存,一旦静态变量被修改,其他对象均对修改可见,故线程非安全。
(2)实例变量(得分情况)
    实例变量即属性是用变量来表示的,这种变量就称为实例变量。实例变量是否存在线程安全隐患得分情况考虑:
a. 实例变量为对象实例私有,在虚拟机的堆中分配,若在系统中只存在一个此对象的实例,在多线程环境下,“犹如”静态变量那样,被某个线程修改后,其他线程对修改均可见,故线程非安全;
b. 如果每个线程执行都是在不同的对象中,那对象与对象之间的实例变量的修改将互不影响,故线程安全。

(3)局部变量(本地变量):线程安全。
a. 局部变量(本地变量)是在方法的内部或方法的一个代码块中声明的变量就是局部变量.作用域是一个方法或代码块,
b. 每个线程执行时将会把局部变量放在各自栈帧的工作内存中,线程间不共享,故不存在线程安全问题。


实例变量和类变量的生命周期
类的成员变量有两种:
一种是被 static 关键字修饰的变量,叫类变量或静态变量;
另一种是没有 static 关键字修饰的变量,叫实例变量。
区别:
 
1、类的静态变量在内存中只有一个,Java 虚拟机在记载类的的过程中为静态变量分配内存,静态变量位于方法区,被类的所有实例共享。静态变量可以直接通过类名被访问。静态变量的生命周期取决于类的生命周期,当加载类的时候,静态变量被创建并分配内存空间,当卸载类的时候,静态变量被销毁并撤销所占内存。
 
2、类的每个实例都有相应的实例变量。没创建一个类的实例,Java 虚拟机就会为实例变量分配一次内存,实例变量位于堆区中。实例变量的生命周期取决于实例的生命周期,当创建实例的时候,实例变量被创建并分配内存,当销毁实例的时候,实例变量被销毁并撤销所占内存。
 
假如成员变量(包括静态变量和实例变量)是引用变量,那么当该成员变量结束生命周期时,并不意味着它所引用的对象也一定结束声明周期。
 
变量的生命周期和对象的生命周期是不同的概念。
静态变量可以作为所有的实例的共享数据,它不依赖于特定的实例;而实例变量属于特定的实例。











分享到:
评论

相关推荐

    局部变量线程安全测试

    标题“局部变量线程安全测试”提示我们,我们将探讨的是局部变量在多线程环境下的行为。局部变量是在方法或代码块内部定义的变量,它们的生命周期只限于定义它们的代码块。由于每个线程都有自己的独立的调用栈,因此...

    Java局部变量线程安全原理分析

    Java局部变量线程安全原理分析 Java局部变量线程安全原理分析是Java编程语言中非常重要的一个概念。通过对Java局部变量线程安全原理的分析,我们可以更好地理解Java的线程安全机制,避免在编程中出现线程安全问题。...

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

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

    java线程安全测试

    在Java中,局部变量是线程安全的,因为每个线程都有自己的局部变量副本,它们不会被其他线程修改。然而,实例变量是共享的,因此在多线程环境下需要特别注意。 以下是一些常见的线程安全问题和解决策略: 1. 数据...

    JAVA多线程并发操作全局变量

    NULL 博文链接:https://toknowme.iteye.com/blog/2212529

    java 多线程 加减变量

    java 多线程 加减变量

    java线程安全总结.doc

    1. **单例模式**:确保一个类只有一个实例,通常需要考虑线程安全的单例实现,如双重检查锁定。 2. **生产者消费者模式**:通过队列来协调生产者和消费者的执行,避免直接的资源竞争。 3. **读写锁**:允许多个线程...

    Java 多线程 订票 示例 线程安全

    在Java中,实现线程安全的方法通常包括同步机制(synchronized关键字)、volatile变量、Lock接口及其实现、原子类(Atomic*)等。 现在,让我们来看一个简单的订票系统的Java多线程示例。假设我们有一个票务系统,...

    Java多线程 - (一) 最简单的线程安全问题

    一个方法或变量被称为线程安全,当它在多线程环境下被调用时,仍然能保证其正确性和完整性。线程不安全则可能引发竞态条件(race condition),即多个线程同时访问和修改同一份数据,导致结果不可预测。 在Java中,...

    java多线程的讲解和实战

    8. **并发集合类**:Java提供了并发安全的集合类,如`ConcurrentHashMap`, `CopyOnWriteArrayList`, `BlockingQueue`等,它们内部实现了线程安全的算法,可以在多线程环境下高效使用。 9. **线程中断**:`interrupt...

    Java多线程与线程安全实践-基于Http协议的断点续传

    在实现断点续传时,每个线程可能负责下载文件的一个部分,通过共享变量(如`AtomicInteger`)记录当前的下载进度,并确保线程安全。 线程安全是多线程编程中的一个重要概念,指的是在多线程环境下,一个类或者对象...

    java多线程并发

    java多线程并发的在新窗口

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

    例如,可以使用 ThreadLocal 来实现线程安全,ThreadLocal 是 Java 中的一个类,它提供了线程安全的变量存储机制。使用 ThreadLocal 可以使每个线程拥有一个自己的变量副本,从而避免了线程安全问题。 下面是一个...

    Java并发中的线程安全性

    考虑以下非线程安全的示例代码: ```java class UnsafeUniqueInteger { private long value = 0; public long getNext() { // 返回一个唯一的整数值。 value++; try { // 模仿实际工作中花费的时间 Thread....

    java多线程Demo

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

    java线程安全性总结

    用思维导图将Java线程安全性相关基本概念联系起来

    Java多线程编程核心技术_完整版_java_

    1. synchronized关键字:用于保证线程安全,它可以修饰方法或代码块,实现对共享资源的互斥访问。 2. volatile关键字:保证变量的可见性和有序性,但不保证原子性。 3. Lock接口与ReentrantLock类:提供了比...

    java多线程进度条

    在Java编程中,多线程是一项关键特性,它允许程序同时执行多个任务,提升系统效率。在处理耗时操作如大文件下载、数据处理或网络请求时,展示进度条能够提供用户友好的交互体验,让使用者了解任务的完成状态。本主题...

    java ThreadLocal多线程专属的变量源码

    java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多...

    线程 JAVA java线程 java线程第3版 java线程第2版第3版合集

    它展示了如何与非线程安全的类共同工作,并特别关注于Swing的线程问题。新增加的一章介绍了如何为多处理器机器编写并行代码。 简而言之,本书的新版涉及了有关线程的方方面面,从最简单的动画applet到最复杂的应用...

Global site tag (gtag.js) - Google Analytics