program tip

"조건"동안 "아무것도"하지 않음

radiobox 2020. 11. 5. 07:52
반응형

"조건"동안 "아무것도"하지 않음


ForkJoinPool (Java 7에서 몇 가지 흥미로운 변경 사항이 있음)의 Java 8 버전에 대한 코드를 탐색하는 동안이 구성을 실행했습니다 ( 여기 ).

do {} while (!blocker.isReleasable() &&
             !blocker.block());

왜 이렇게 쓰는지 고민하고 있습니다.

while (!blocker.isReleasable() &&
       !blocker.block());

첫 번째 구문을 다음과 같이 읽을 수 있기 때문에 의미론 / 가독성 선택 do "nothing" while "conditions"입니까? 아니면 내가 놓친 추가 혜택이 있습니까?


파일 상단의 클래스 선언 바로 아래에있는 주석을 읽으면이 구문의 사용을 설명하는 섹션이 있습니다.

Style notes

===========

[...]

There are several occurrences of the unusual "do {} while
(!cas...)"  which is the simplest way to force an update of a
CAS'ed variable. There are also other coding oddities (including
several unnecessary-looking hoisted null checks) that help
some methods perform reasonably even when interpreted (not
compiled).

ForkJoinPoolcompareAndSwap...from 을 광범위하게 사용 sun.misc.Unsafe하고 do {} while (...)in can- ForkJoinPool다른 답변에서 언급했듯이 대부분의 경우 스타일 메모 제목 아래의이 주석으로 설명됩니다.

* There are several occurrences of the unusual "do {} while
* (!cas...)"  which is the simplest way to force an update of a
* CAS'ed variable. 

사용하는 선택 은 대부분 문체 선택 인 것처럼 보이지만 while빈 본문으로 루프를 작성합니다 do {} while (condition). 이것은 HashMapJava 8에서 업데이트 된에서 더 명확 할 것입니다.

Java 7에서는 HashMap다음을 찾을 수 있습니다.

while (index < t.length && (next = t[index++]) == null)
    ;

주변의 많은 코드도 변경되었지만 Java 8의 대체 항목은 다음과 같습니다.

do {} while (index < t.length && (next = t[index++]) == null);

첫 번째 버전은 단독 세미콜론을 삭제하면 다음 줄에 따라 프로그램의 의미가 바뀌는 단점이 있습니다.

아래에서 볼 수 있듯이 while (...) {}do {} while (...);의해 생성 된 바이트 코드 는 약간 다르지만 실행시 어떤 영향도주지 않습니다.

자바 코드 :

class WhileTest {
    boolean condition;

    void waitWhile() {
        while(!condition);
    }

    void waitDoWhile() {
        do {} while(!condition);
    }
}

생성 된 코드 :

class WhileTest {
  boolean condition;

  WhileTest();
    Code:
       0: aload_0       
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return        

  void waitWhile();
    Code:
       0: aload_0       
       1: getfield      #2                  // Field condition:Z
       4: ifne          10
       7: goto          0
      10: return        

  void waitDoWhile();
    Code:
       0: aload_0       
       1: getfield      #2                  // Field condition:Z
       4: ifeq          0
       7: return        
}

잠재적 인 성능 이점을 제쳐두고 가독성 이점이 분명합니다.

With while (X) ; the trailing semicolon is not always obvious at first glance, you may be confused into thinking that the following statement or statements are inside the loop. For example:

while (x==process(y));
if (z=x) {
    // do stuff.
}

It would be very easy to misread the above as having the if statement inside the loop, and even if you did read it correctly it would be easy to think that it was a programming mistake and the if should be inside the loop.

With do {} while(X); though it is immediately at a glance clear that there is no body to the loop.


If you will read comment above the code, It is mentioned that...

If the caller is not a ForkJoinTask, this method is behaviorally equivalent to

while (!blocker.isReleasable())
   if (blocker.block())
      return;
}

So it is just another form to implement above code in else part...!!

In Style notes it is mentioned that,

There are several occurrences of the unusual "do {} while (!cas...)" which is the simplest way to force an update of a CAS'ed variable.

And if you will see implementation of ManagedLocker#isReleasable, It is updating the lock and returns true if blocking is unnecessary.

Interpretation :

Blank while loops are used to provide an interrupt until some condition reset to true/false.

Here, do { } while(!...) is a blocker/interrupt until blocker.block() will be true when blocker.isReleasable() is false. Loop will continue execution while blocker is not releasable (!blocker.isReleasable()) and blocker is not blocked !! Execution will be out of loop as soon as blocker.block() will set to true.

Note that, do{ } while(...) does not update CAS variable, but it guarantee that program will wait until variable gets updated (force to wait until variable gets updated).


You can easily make something like this with:

if(true){
 //Do nothing ...
}

참고URL : https://stackoverflow.com/questions/24609564/do-nothing-while-condition

반응형