2017-05-01 1 views
-1

자바에서 동기화 개념을 읽고 동기화 된 명령문을 발견했습니다.java에서 Synchronized Statements에 인수를 전달해야하는 이유는 무엇입니까?

내가 정적 블록 (그냥 예제 일뿐)처럼 보이지만 전달 된 인수에 그와 함께 지정된 데이터 유형이 없더라도 왜 인수를 전달해야하는지 알고 싶습니다.

예 : 하나 그것에 대해 알고

public class MsLunch { 
    private long c1 = 0; 
    private long c2 = 0; 
    private Object lock1 = new Object(); 
    private Object lock2 = new Object(); 

    public void inc1() { 
     synchronized(lock1) { 
      c1++; 
     } 
    } 

    public void inc2() { 
     synchronized(lock2) { 
      c2++; 
     } 
    } 
} 

경우, 설명해주십시오.

+0

https://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html – kosa

+2

어떤 객체를 잠그고 있는지 말할 필요가 있기 때문입니다. –

+1

'lock1'과'lock2'가 전달되는 것에 대해 이야기하고 있습니까? 그것들은 동기화되고있는 객체입니다. – Carcigenicate

답변

-1

다중 스레드 응용 프로그램에서 객체의 상태를 여러 스레드가 동기화 된 방식으로 읽고 쓰려면, synchronized 키워드를 사용합니다.

자바가 동기화를 지원하기 위해 사용하는 메커니즘이 모니터입니다. 각 오브젝트에는 연관된 모니터가 있습니다. 동기화 된 블록은 작업 할 객체가 필요하므로 경쟁중인 스레드가 경쟁 할 수 있고 승자 스레드가 모니터를 확보 할 수 있습니다.

java의 각 정적 메소드에는 특정 메소드가 호출되는 암시적인 this 오브젝트가 있습니다. 메서드 시그니처에 synchronized 키워드를 사용하면 암시적인 this 개체에 의존한다는 것을 의미합니다. 다른 객체에 의존하려면 synchronized 블록을 사용하고 블록에 객체 참조를 사용할 수 있습니다.

여러 개의 synchronized 블록이있을 수 있지만 동일한 개체의 블록이 synchronized 인 블록을 기억하면 서로에 대해 적절한 동기화 된 실행 만 보장됩니다. 서로 다른 객체의 참조를 갖는 동기화 된 블록은 스레드가 동기화 된 방식으로 작동하도록 강제하지 않습니다.

따라서 objectX의 일부 상태를 수정하고 ObjectA와 동기화 된 블록으로 작동하는 threadA가있는 경우를 가정 해보십시오. 다른 코드에서 다른 threadB가 같은 objectX의 상태를 읽을 수있는 다른 클래스에있을 수 있습니다. 이제 threadB는 ObjectA와의 동기화 된 블록 내에서 독서를 수행하여 objectX의 상태를 올바르게 읽어야합니다.

+0

downvote에 대한 이유, 나는 자신을 정정하게되어 기쁘게 생각합니다. –

+0

그건 내가 아니었지만 당신의 대답은 정말로 그 질문에 대답하지 않습니다. OP는 '동기화 된'튜토리얼을 요구하지 않았다. 진짜 대답은 매우 간단합니다 : 1)'lock1'과'lock2'은 여러분이 잠그고있는 뮤텍스이고, 2는 메소드 호출이 아니기 때문에 인수가 아닙니다. –

+0

@ nits.kk 그것은 아니지만 어떤 사람은 내 질문을 중복으로 표시했습니다. 그가 대답을 downvote 수 있습니다. –

관련 문제