public class SomeClass extends Thread {
...
private double a;
private double b;
private double increaseVal;
public void setIncreaseVal(double increaseVal) {
this.increaseVal = increaseVal;
}
private void updateAB() {
...
// Computing the new a and b values
a = ... * increaseVal;
b = ... * increaseVal;
...
}
@Override
public void run() {
try {
...
updateAB();
Thread.sleep(500);
}
...
}
}
public class OtherClass {
...
private HashMap<String, SomeClass> someClasses;
private void setIncreaseValue(String id, double value){
...
someClasses.get(id).setIncreaseValue(value);
...
}
}
든 increaseVal
SomeClass
updateAB
방법 등이 처리 될 때 동일한 increaseVal
값이 이용되는 경우 모두 a
및 b
필드를 잠그는 것이 가능 업데이트 되었습니까?
setIncreaseValue
이 OtherClass
인 경우 a
이 업데이트 된 후 increaseVal
의 값을 변경할 수 있습니다. b
이 업데이트되면이 방식으로 increaseVal
의 새 값이 사용됩니다. 나는 그것을 피하고 싶습니다.
a
과 b
값을 업데이트하기 전에 synchronized(this)
을 입력하면 제대로 작동합니까? 이처럼
:
synchronized(this) {
// Computing the new a and b values
a = ... * increaseVal;
b = ... * increaseVal;
}
감사합니다!
주셔서 감사합니다 유용한 정보 코포에 대한 많은 : I/O 작업, DB와 같은 액세스)의 다음 전체 방법보다는
a
,b
및increaseVal
를 사용하는 경우에만 코드를 동기화하는 의미가 있기 때문이다. 당신이 내 마음에 들지 않는다면, 나는 멀티 스레딩에 대해 약간 새로운 것처럼, '이'모양보다 다른 무엇이 잠금 상태일까요? 또는'a','b' 및'increaseVal'에 대해서만 특정 잠금을 만드는 것이 어떻게 가능합니까? – Mihai당신은 대단히 환영합니다. 모든 오브젝트는 잠금으로 사용할 수 있습니다. 예를 들어,이 객체를 다음과 같이 클래스의 필드로 정의 할 수 있습니다 :'private Object aLock = new Object();'그리고 동기화 된 블록에서 사용 :'synchronized (aLock) {...}'. 다른 잠금을 사용하고 코드가 잘 설계되지 않은 경우 스레드가 안전하지 않거나 교착 상태가 발생할 수 있음을 유의하십시오. –