当前位置: 首页 > 面试题库 >

Java变量本身是线程安全的吗?更新变量时?

洪璞瑜
2023-03-14
问题内容

假设我有两个线程在更新一个对象,一个线程在不同步的情况下从该对象读取。显然,这是运行条件。但是,我想知道变量本身是否只能部分写入。

public class CommonObject extends Object
{
    static int memberVar=-1;
}

public class Input1Thread extends Thread
{   
    public void run()   
    {
        while(true)
            CommonObject.memberVar = 1
    }
}

public class Input2Thread extends Thread
{   
    public void run()   
    {
        while(true)
            CommonObject.memberVar = 2;
    }
}

public class OutputThread extends Thread
{   
    public void run()   
    {
        while(true)
            System.out.println("CommonObject.memberVar"+ CommonObject.memberVar);
    }
}

我假设打印出的值也将是2或1。但是,我想知道变量是否可能设置为一半?

我以原语为例,但如果对象不同,我希望答案也适用于对象。


问题答案:

这取决于变量的类型。

doubles和longs(Java中的两种64位类型)如果不是volatile,则允许字眼翻译,而所有其他类型(包括引用)可能永远不会撕裂。单词撕裂会给您带来您担心的行为:某些字节来自旧值,某些字节来自新值,并且总体结果是一个既不是旧值也不是新值的值。

这在JLS17.7中指定:

出于Java编程语言内存模型的目的,对非易失性long或double值的单次写入被视为两次单独的写入:一次写入每个32位的一半。这可能导致线程从一次写入中看到64位值的前32位,而从另一次写入中看到后32位的情况。

易失的long和double值的写入和读取始终是原子的。

引用的写入和读取始终是原子的,无论它们是实现为32位还是64位值。

当然,引入数据竞争会带来很多问题。但是您的问题专门针对单词撕裂,因此,我只在这里解决这个问题,只是要注意“仅仅因为您可以,并不意味着您应该这样做”。您应该小心分析每个数据竞争,并
证明 它是良性的(就像其中的一些竞争一样,例如String.hashCode对其值的缓存)。



 类似资料:
  • 问题内容: 给出以下代码: 线程类将定期(通过执行器每5分钟更新一次)myConfigData成员变量。myConfigData的设置是否在“外部”线程中是线程安全的(原子的),还是我必须将每个读写操作都同步到myConfigData变量? 编辑:问题不是ConcurrentHashMap是否是线程安全的(根据Javadoc),而是ConcurrentHashMap本身在myConfigData

  • 我的问题与静态变量的线程安全有关。 如果两个线程,t1具有静态锁,t2具有对象锁,可以同时继续,那么A类的状态测试将如何是线程安全的呢? 可能是,我错过了一些非常基本的东西,但不确定它是如何工作的。 根据下面的答案,我得到的印象是,如果必须使这些状态成为线程安全的,那么两个锁都应该由正在更新此状态的线程持有,或者确保它被仅静态方法或仅非静态方法访问。对吧?

  • 问题内容: 我已经阅读了很多,但是还没有找到确切的答案。 我有一堂课,看起来像这样: 而且我想知道从Foo实例访问sharedData是否是线程安全的(如构造函数和doSomethingUseful()中所示)。Foo的许多实例将在多线程环境中创建。 我的意图是在静态初始化程序中初始化sharedData,此后不进行修改(只读)。 我读到的是,不可变对象本质上是线程安全的。但是我仅在实例变量的上下

  • 问题内容: 我是Python和程序设计的新手,但似乎无法理解为什么此函数不更新全局变量 我也尝试过 问题答案: 需要声明的是是全球性的 内部 ,而不是外面。 该语句告诉Python,在函数范围内,它引用的是全局变量,而不是一些新的局部变量。

  • $security true/false, default is false. Security is good for situations when you have untrusted parties editing the templates (via ftp for example) and you want to reduce the risk of system security c