자바에서 부모 객체를 잠그는 메소드 허용
-
22-07-2019 - |
문제
Java가 들어있는 객체를 잠글 수있는 방법을 얻는 방법이 있습니까?
나는 이것이 혼란스러워 보이지만 기본적으로 나는 C# 의이 스 니펫과 동등한 것이 아니라 Java에서 동등하지 않다.
lock(this)
{
// Some code here...
}
.NET로 작성된 API를 Java로 다시 구현하는 임무를 맡았으며 Java 버전을 인간적으로 가능한 .NET 버전과 유사하게 유지하라는 요청을 받았습니다. 이는 .NET 버전이 액세스 할 수없는 C ++ 버전에서 기록 된 것처럼 보였기 때문에 도움이되지 않습니다.
어쨌든 위의 줄은 C# 버전에 나타나며 Java에서 동일한 작업이 필요합니다.
해결책
그것의 동등한 것은 다음과 같습니다.
synchronized (this)
{
}
(아니요, 일반적으로 C# 또는 Java에서 수행해서는 안됩니다. 다른 액세스 권한이없는 개인 참조를 고정하는 것을 선호합니다. 물론 이미 그 사실을 알고있을 수도 있지만 답을 남기고 싶지 않았습니다. 경고없이 :)
다른 팁
C ++ 코드가 간단한 뮤트라고 가정하면 "잠금"을 "동기화"로 바꾸십시오.
synchronized (this)
{
// ...
}
여기에 있습니다 Java 동시성 튜토리얼 더 많은 정보를 위해서
Brian Goetz 's를 추천합니다.실제로 Java 동시성. "훌륭한 책입니다.
동기화 된 블록을 최대한 작게 유지하는 것이 좋습니다. 이 방법에서 동기화 된 수정자를 사용하는 것은 거친 입자이며 때로는 필요하지만 그렇지 않으면 다른 객체를 사용하여 블록을 더 작게 유지할 수 있습니다.
이와 같이:
public class PrivateLock {
private final Object myLock = new Object();
@GuardedBy("myLock") Widget widget;
void someMethod() {
synchronized (myLock) {
// Access or modify the state of widget
}
}
}
또한 세마포어, 교환기 등과 같은 추가 동시성 관리 객체에 대해서는 API (JDK 5.0+)의 java.util.concurrent 패키지를 살펴 봐야합니다.
http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/package-summary.html