Java Memory Model Pragmatics (Aleksey Shipilёv, Russia), part 2

แชร์
ฝัง
  • เผยแพร่เมื่อ 17 ก.ย. 2024
  • Java Memory Model (JMM) specification tries to be very concise yet complete. Because JMM tries to embrace a very large set of phenomenon, its formalism is very heavy, which unfortunately resulted in losing the “humanity” of the spec.
    In this talk, we will follow the logic of the model; review what pragmatic results the model was trying to achieve; look closely at the real world limitations the model had to endure; see how JMM tries to balance between developers’ needs and runtime/hardware maintainers requests.

ความคิดเห็น • 6

  • @acidelk
    @acidelk 4 ปีที่แล้ว

    Возможно ли воспроизвести кейс с частичной инициализацией (20:30) на x86?
    Пытался добиться (в этом примере) x==0, но так и не смог...
    Если ссылка утечет из конструктора наружу, то все понятно, но в данном кейсе не могу понять...

  • @germanberezhko1050
    @germanberezhko1050 8 ปีที่แล้ว +1

    на 20:28 объясните про NPE, пожалуйста

    • @waliot_cto
      @waliot_cto 8 ปีที่แล้ว +1

      docs.oracle.com/javase/7/docs/api/java/lang/NullPointerException.html

    • @POWERon4ik
      @POWERon4ik 8 ปีที่แล้ว +2

      на сколько я понимаю, в println(a.f), a заново читается, и это отдельная операция, а jvm может это чтение вынести за то чтение которое произошло для if-а. Т.е. может быть такой порядок
      r1 = a; //тут а еще null
      r2 = a; //тут уже все ок
      if (r2 != null) {
      _//предполагается что r1 = a должно быть здесь
      ___r3 = r1.f; // NPE
      ___println(r3);
      }

    • @maksymkoval1754
      @maksymkoval1754 6 ปีที่แล้ว +2

      В ARM при чтении в регистры поток может реордерить чтения.
      Записывая в local ты гарантируешь, что ты работаешь ровно с одной переменной, а не с двумя, которые сделали два независимых чтения.
      Будет два разных чтения, но в x86/64 это не приведет к проблеммам т.к. оно прочитает по прядку (если конечно нет ничаких оптимизаций -- а они не ломают JMM).
      К слову Java может "склеить" два одинаковых чтения в одно чтение (но это вариант оптимизации).

    • @landaumanify
      @landaumanify 5 ปีที่แล้ว

      out of thin air запрещены, поэтому мы можем прочитать там только то, что потенциально могли видеть в программе: либо 0 (дефолтное значение ф до выполнения конструктора), 42 или нпе из-за того, что а еще не успел проинититься. А почему мы можем прочитать налл во втором чтении после ифа? Потому что модель памяти в теории это позволяет сделать, а значит на каком-то железе, жвм или компиляторе теоретически такая ситуация возможна. Понятное дело, что на х86 с его встроенным loadload барьером эту ситуация вряд ли можно встретить будет, но в теории такое возможно. Мы же говорим о модели и ее ограничениях, а не о конкретных реализациях. Но даже на х86 компиль или джит вполне могут что-то сделать, что приведет к подобному исполнению