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

并发代码中赋值运算符的返回值

胡元明
2023-03-14
问题内容

给定以下类别:

class Foo {
  public volatile int number;

  public int method1() {
    int ret = number = 1;
    return ret;
  }

  public int method2() {
    int ret = number = 2;
    return ret;
  }
}

给定多个线程method1()method2()在同一Foo实例上并发调用,对method1()的调用是否可以返回除1以外的任何值?


问题答案:

JLS 15.26指定:

有12个赋值运算符;在语法上都是右关联的(它们从右到左分组)。因此,a = b = c意味着a =(b =
c),它将c的值分配给b,然后将b的值分配给a。

特德·霍普(Ted Hopp)的回答表明,Sun的javac并没有遵循这种行为,这可能是一种优化。

由于此处存在线程,因此method1的行为将不确定。如果Sun的编译器使行为恒定,那么它就不会脱离未定义的行为。



 类似资料:
  • 主要内容:基本赋值运算符,扩展后的赋值运算符赋值运算符用来把右侧的值传递给左侧的变量(或者常量);可以直接将右侧的值交给左侧的变量,也可以进行某些运算后再交给左侧的变量,比如加减乘除、函数调用、逻辑运算等。 Python 中最基本的赋值运算符是等号 ;结合其它运算符, 还能扩展出更强大的赋值运算符。 基本赋值运算符 是 Python 中最常见、最基本的赋值运算符,用来将一个表达式的值赋给另一个变量,请看下面的例子: 连续赋值 Python

  • 赋值运算符是指为变量或常量指定数值的符号。赋值运算符的符号为“=”,它是双目运算符,左边的操作数必须是变量,不能是常量或表达式。 其语法格式如下所示: 在 Java 语言中,“变量名称”和“表达式”内容的类型必须匹配,如果类型不匹配则需要自动转化为对应的类型。 赋值运算符的优先级低于算术运算符,结合方向是自右向左;不是数学中的等号,它表示一个动作,即将其右侧的值送到左侧的变量中(左侧只允许是变量,

  • C++提供了几个赋值运算符可以缩写赋值表达式。例如下列语句: c = c + 3 可以用加法赋值运算符(addition assignment operator)“+=”缩写如下: c += 3 +=运算符将运算符右边表达式的值与运算符左边表达式的值相加,并将结果存放在运算符左边表达式的值中。下列形式的语句: variable = variable operator expression; 其中

  • 问题内容: 什么是(等号号)赋值运算符做PHP? 是否已弃用? 问题答案: 它没有被弃用,也不太可能被弃用。例如,这是一种标准方法,可以对一个数组或对象镜像进行更改,而对另一数组进行更改,而不是复制现有数据。 这称为 按引用赋值,引用 引用该手册,“意味着两个变量最终都指向相同的数据,而没有任何内容被复制到任何地方”。 不赞成使用的唯一方法 是 PHP 5中的 “通过引用分配结果” ,这可能是造成

  • 本文向大家介绍整理Python中的赋值运算符,包括了整理Python中的赋值运算符的使用技巧和注意事项,需要的朋友参考一下 下表列出了所有Python语言支持的赋值运算符。假设变量a持有10和变量b持有20,则:  例如: 试试下面的例子就明白了所有在Python编程语言可供选择的赋值运算符: 当执行上面的程序,它会产生以下结果:

  • 问题内容: 我知道您可以在JavaScript中执行以下操作: 其中变量将在第一表达式的值,如果它不是,或。在这种情况下,它将被分配给第二条语句的值。 但是,当我们使用逻辑AND运算符时,变量将分配给什么? 非假的时候会发生什么?假的 时候会发生什么? 只是学习JavaScript,我很好奇结合AND运算符的赋值会发生什么。 问题答案: 基本上,逻辑与运算符(),将返回第二操作数的值,如果第一个是