public class Computation extends Thread {
private int num;
private boolean isComplete;
public Computation(int nu) {
num = nu;
}
public void run() {
System.out.println("Thread Called is: " + Thread.currentThread().getName());
}
public static void main(String... args) {
Computation [] c = new Computation[4];
for (int i = 0; i < 3; i++) {
c[i] = new Computation(i);
c[i].start();
}
}
}
내 질문은 스레드가 시작될 때마다 새 Computation 객체를 생성하는 주 함수에 있는데 왜 run 메서드를 snchrnoized해야합니까? 모든 다른 클래스 객체에 대해 알고 있듯이 'this'참조는 다르므로 동기화 할 필요가 없습니다.
또한 다른 예에서 :
public class DiffObjSynchronized implements Runnable {
@Override
public void run() {
move(Thread.currentThread().getId());
}
public synchronized void move(long id) {
System.out.print(id + " ");
System.out.print(id + " ");
}
public static void main(String []args) {
DiffObjSynchronized a = new DiffObjSynchronized();
/**** output ****/
// 8 9 8 9
new Thread(a).start();
new Thread(new DiffObjSynchronized()).start();
}
}
다음은 두 번째 클래스 인스턴스에 대해 스레드를 처음 만드는 것과 같은 두 번째 예제입니다. 여기서는 move () 메서드를 동기화하지만 정의에 따라 "두 개의 다른 개체가 동시에 동기화 된 메서드에 들어갈 수 있습니다."
피드백을 공유해주세요.
내가 당신을 올바르게 이해한다면, 당신의 질문은 "왜 move
방법이 동기화되어 있는가?"입니다.
대답은 다음과 같은 두 가지 이유로 인해 안됩니다.
필드에 액세스하지 않으므로 해당 메서드 내에 한 번에 많은 스레드가있어 손상 될 수있는 것은 없습니다.
각 스레드는 객체의 다른 인스턴스를 가져 오므로 다른 잠금을 갖습니다. 따라서 동기화 된 수정자는 차이가 없습니다. 각 스레드 move
는 별도의 잠금을 가지고 있기 때문에 자체 인스턴스의 메서드를 계속 입력 할 수 있습니다 .
스레드간에 공유되는 데이터가 있고 하나 이상의 스레드가 해당 데이터를 수정하는 경우에만 동기화하면됩니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다