我相信,我正在处理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
              }
          }
      }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top