2010-02-24 1 views
0

정보가있는 벡터를 보유 할 정적 클래스를 만듭니다. 다른 사람이 벡터를 편집하거나 읽는 경우 클래스가 잠길 수 있도록 동기화해야합니다.정적 클래스를 잠그는 (동기화) 방법?

가장 좋은 방법은 무엇입니까? , 당신은 "정적 클래스가 무엇을 의미하는지 정확히 정의 할 필요가 사전에

public synchronized insertIntoVector(int id) 
{ 

} 

감사합니다 :) 첫째

답변

5

:

은 충분히 같은 클래스 내에서 동기화되는 기능을 가지고하는 것입니다 ". 처음에는 모든 메서드가 정적 인 클래스를 의미한다고 생각했지만 코드 조각은 그렇지 않다는 것을 의미합니다.

어떤 경우이든 클래스 내부의 동기화 된 메서드는 인스턴스 메서드 인 경우 synchronized(this)이거나 정적 메서드 인 경우 synchronized(TheContainingClassName.class)과 같습니다.

모든 정적 메서드로 인스턴스화 할 수없는 클래스를 만들거나 단일 톤으로 작동하는 클래스를 만드는 경우 클래스의 모든 메서드를 동기화하면 메서드를 호출 할 수있는 스레드가 하나만있을 수 있습니다. 한 번에.

가능한 경우 사용자의 메소드가 원자 적이어야하는지 확인하십시오. 다른 메소드에 대한 호출은 다른 스레드에 의해 인터리브 될 수 있으므로 setFoo()이라고하는 다른 스레드가있는 경우 호출 뒤에 setFoo() (아마도 foo 변수를 증가시킨 후)과 같은 것이 원하는 효과를 내지 못할 수 있습니다. 가장 좋은 방법은 incrementFoo()과 같은 방법을 사용하는 것입니다. 또는 (가능하지 않은 경우) 동기화 세부 정보를 게시하여 호출자가 전체 호출 순서 중에 클래스/인스턴스에 대한 잠금을 수동으로 유지할 수 있도록 할 수 있습니다.

+0

내가 원하는 것은 인스턴스화해서는 안되는 클래스입니다. 그러나 일부 기능이 사용되면 전체 클래스가 잠겨 야합니다. – Ikky

+0

Andrzej Doyle이 당신이하고 싶은 말을 추측 한 것 같습니다. 결론 : 동기화 된 정적 메서드로 모든 것이 YourClass.class와 동기화되므로 충분합니다. 메소드 내에서 코드하는 내용에주의하십시오! – helios

+0

답변 주셔서 감사합니다 :) – Ikky

1

AFAIK, Java에는 "정적 클래스"와 같은 것이 없습니다. 정적 메서드 만 포함하는 클래스를 의미합니까? 만약 그렇다면,

public static synchronized void insertIntoVector(int id) { 

} 

이 정적 메소드는 그들 모두가 동기화되어 있으면 충분하다 클래스 객체에 대해 동기화한다. 뜻 경우

(단어 "정적"정적 메소드는 상이한 의미를 갖는다) 정적 내부 클래스

public synchronized void insertIntoVector(int id) 
{ 

} 

는 정적 내부 클래스의 인스턴스에 대해 동기화한다.

+0

답변 해 주셔서 감사합니다 :) – Ikky