Java中引用变量读写的原子性

时间:2016-11-23 20:55:37

标签: java multithreading concurrency atomicity

首先引用 来自JLS 8 Sec 17.7

  

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

这给我带来困惑的场景,给定了Employee类和这个名为calculate的类中的方法,该方法返回对Employee实例的引用。

Employee emp = calculate();

当对变量的写入是原子的时,这意味着在原子操作完成之前没有其他线程可以访问该变量,并且在给定的赋值示例中,写入的原子性是否包括对右侧的评估。赋值(无论多么复杂),或者写入的原子性是否仅适用于完全评估右侧的时间,然后实际完成写入操作。

换句话说,我问在评估calculate()期间,是否拒绝其他线程对emp变量的访问,或者仅在赋值的右侧拒绝访问emp变量是否已完全评估并且public static void ReadSeatPrices() { using (var reader = new StreamReader(File.OpenRead("seat.txt"))) { int i = 0; while (!reader.EndOfStream) { var double result; if (double.TryParse(reader.ReadLine(), out result)) { seatprices[i] = result; i++; } else { //something goes wrong } } } } 的写入操作开始了?

很抱歉这个故事很长,而且 非常感谢!

1 个答案:

答案 0 :(得分:5)

写入的原子性意味着在您准备存储值时,写入将以每个线程(1)读取前一个值或( 2)读取新值,但绝不会损坏。在您的情况下,执行语句的逻辑

import Footer from '/your-path-to-/footer.js'
import React, {Component} from 'react';
import ReactDOM from 'react-dom';

class Footer extends Component {
 render () {
  return (
  <div>
    <div className="footer">
     <div className="container">
       <div className="col-md-5 f-first-part">
         <div className="row">
           <div className="col-sm-5 f-add-part">

             <div className="contact-info">
                            <p className="address">123</p>
                            <p className="email"><a href=""></a></p>
                            <p className="tele"><a href=""> 03580368</a></p>
             </div>

              <div className="large-3 large-offset-2 columns">
                <ul className="menu vertical">
                  <li><a href="#">One</a></li>
                  <li><a href="#">Two</a></li>
                  <li><a href="#">Three</a></li>
                  <li><a href="#">Four</a></li>
                </ul>
              </div>

              <div className="large-3 columns">
                <ul className="menu vertical">
                  <li><a href="#">One</a></li>
                  <li><a href="#">Two</a></li>
                  <li><a href="#">Three</a></li>
                  <li><a href="#">Four</a></li>
                </ul>
              </div>

             </div>
            </div>
        </div>
      </div>
  </div>
    )
  }
}
ReactDOM.render(<Footer/>, document.getElementById('main'));

可以分为两个步骤:

  1. 调用<div id="main"></div> 方法并获取值;我们称之为dts <- seq(from = as.Date("2016-01-01"),to = as.Date("2016-01-28"), by = 7) ggplot(d, aes(x=date, y = value,group=1)) + geom_point() + scale_x_date(labels=format(dts,"%b %d"), breaks = dts) + geom_line()+xlab("date")
  2. 以原子方式将emp = calcluate(); 写入calcluate
  3. 这意味着如果您在val函数仍在进行时尝试阅读val(或者,在它返回之间的时间范围内,并且尚未编写该值) ),你将获得emp中已经发生的任何价值。其他线程不会被阻止读取它。如果你想这样做,你需要使用一些明确的同步。

    (作为注释 - 原子性并不意味着&#34;所有其他线程将被阻塞,直到值准备好。&#34;这意味着&#34;所有其他线程将在操作之前完全看到状态完成或完全在操作完成后完成,但没有别的。&#34;)