Java 익명 클래스 및 동기화 및 "this"
-
03-07-2019 - |
문제
나는 내 Java Gui에서 인종 조건을 다루고 있다고 생각합니다.
익명 클래스 내에서 다음과 같은 "익명 방법"을 생성하는 몇 가지 방법이 있습니다.
synchronized foo()
{
someMethod(new TimerTask()
{
public synchronized run()
{
//stuff
}
};
}
질문 : Timertask 객체 또는 Foo가있는 클래스에 동기화 된 실행 메소드입니까?
Question2 : run () 선언에서 "동기화 된"을 제거하고 대신 run () 본체 내부에 동기화 된 (this) {} 블록이있는 경우, "이"는 타이 머스 객체 또는 객체를 참조합니다. foo ()를 포함하는 메소드 인스턴스입니까?
여기서 도와주세요.
감사합니다, JBU
해결책
그만큼 run
메소드는 동기화됩니다 TimerTask
그 자체. 동기화 인스턴스 방법입니다 언제나 동기화 this
물체. (클래스 메소드는 동기화됩니다 Class
물체.)
그 객체에 동기화하려면 foo
회원입니다 자격을 갖추십시오 this
예어. 가정하다 foo()
The의 회원입니다 Bar
수업, 내부 run()
의 방법 TimerTask
, 당신이 사용할 수있는
public void run() {
synchronized(Bar.this) {
...
}
}
다른 팁
나는이 답변을 확신하지만 좋은 소스 ATM을 파낼 수는 없습니다.
첫 번째 질문 :
동기화 된 것은 타이머 스탁에서 잠금됩니다.
두 번째 질문 :
이것은 타이머 스탁을 의미합니다. 포함 된 개체를 잠그고 싶다면 MyContainingObject를 사용합니다.
스윙 요소에 액세스 할 수있는 스레드는 하나뿐입니다. 그것은 awt-eventqueue-0입니다. 당신은 이것을 알고 있어야합니다. 다른 스레드가 드러나거나 변경되는 경우 GUI가 충돌 할 확률이 매우 양호합니다. 이 스레드로 GUI를 실행하려면 다음과 같습니다.
try { SwingUtilities.invokeAndWait(new Runnable(){ public void run(){ Swing_Prozor1 prozor = new Swing_Prozor1(); } }); } catch (InterruptedException e) { //namjerno zanemareno } catch (InvocationTargetException e) { //namjerno zanemareno }
그리고 Anonymus 클래스가 있다면 이것은 당신에게 당신의 클래스 인스턴스를 제공 할 것입니다. 따라서 Anonymus 클래스에서 글을 쓰고 있다면 이것. 해당 클래스의 인스턴스입니다. 클래스 인스턴스를 얻으려면 쓰기를 원하는 것입니다.
classname.this
흠 당신이 쓴 위의 코드는 이것을 말해줍니다. 당신은 코드의 일부를 두 번 먹었습니다. SynCronized 메소드를 작성하면 한 번만이 메소드에 한 번에 액세스 할 수 있음을 의미합니다. SynCronized 메소드가 잠금 해제되는 동안 다른 스레드가 기다립니다.
foo () 및 run ()을 동기화하려는 경우
최종 객체 잠금 = 새 개체 ();
그런 다음 동기화하십시오.
foo() {
synchronized(lock) {
someMethod(new TimerTask() {
public void run() {
synchronized(lock) {
//stuff
}
}
}