java匿名类和同步和“这个”
-
03-07-2019 - |
题
我相信,我正在处理JAVA GUI中的竞争条件。
我有一些创建“匿名方法”的方法。在这样的匿名类中:
synchronized foo()
{
someMethod(new TimerTask()
{
public synchronized run()
{
//stuff
}
};
}
问题:是否在TimerTask对象或foo所在的类上同步了run方法?
问题2:如果我摆脱了“同步”的话在run()声明中,而在run()体内有一个synchronized(this){}块,将“this”请参考TimerTask对象或作为包含foo()的方法实例的对象?
请帮帮我。
谢谢, JBU
解决方案
run
方法在 TimerTask
本身上同步。已同步实例方法始终在此
对象上同步。 (类方法在 Class
对象上同步。)
如果要同步 foo
所属的对象,则需要限定 this
关键字。假设 foo()
是<的成员code> Bar 类,在 runT(
>的 run()
方法内,可以使用
public void run() {
synchronized(Bar.this) {
...
}
}
其他提示
我很确定这些答案,但我无法找到一个好的来源atm。
第一个问题:
synchronized将锁定TimerTask。
第二个问题:
这指的是TimerTask;如果你想锁定包含对象,你可以使用MyContainingObject.this
只有一个线程可以访问swing元素。那是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类中写这个。是该类的实例。要获得要编写的类实例:
ClassName.this
嗯,你写的上面代码告诉我这个。您两次检测到部分代码。 编写同步方法时,意味着一次只能有一个线程访问此方法。其他线程在同步方法解锁时等待。
如果您正在寻找同步foo()和run(),那么您可以创建一个显式锁定对象,如
final Object lock = new Object();
然后同步它。
foo() {
synchronized(lock) {
someMethod(new TimerTask() {
public void run() {
synchronized(lock) {
//stuff
}
}
}