有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java匿名类和同步以及“this”

我相信,在我的JavaGUI中,我正在处理一个竞争条件

我有一些方法可以在匿名类中创建“匿名方法”,如下所示:

synchronized foo()
{
     someMethod(new TimerTask()
     {
          public synchronized run()
          {

               //stuff

          }
     };
}

问题:这个run方法是在TimerTask对象上同步的还是在foo所在的类上同步的

问题2:如果我在run()声明中去掉了“synchronized”,而在run()体内有一个synchronized(this){}块,“this”是指TimerTask对象还是指包含foo()的方法的实例对象

请帮帮我

谢谢, jbu


共 (4) 个答案

  1. # 1 楼答案

    run方法在TimerTask本身上同步。同步的instance methods are always synchronized on ^{}对象。(类方法在Class对象上同步。)

    如果要在foo是其成员的对象上进行同步,需要qualify the ^{} keyword.假设foo()Bar类的成员,在TimerTaskrun()方法中,可以使用

    public void run() {
      synchronized(Bar.this) {
        ...
      }
    }
    
  2. # 2 楼答案

    如果要同步foo()和run(),那么可以创建一个显式锁对象,如

    最终对象锁定=新对象()

    然后在上面同步

    foo() {
        synchronized(lock) {
           someMethod(new TimerTask() {
              public void run() {
                  synchronized(lock)  {
                         //stuff
                  }
              }
          }
    
  3. # 3 楼答案

    只有一个线程可以访问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类,这会给出你所在的类的实例,所以如果你在anonymus类中写这个。是那个类的实例。要获取要编写的类的实例,请执行以下操作:

    ClassName.this

    你上面写的代码告诉我。你两次屏蔽了部分代码。 当您编写syncronized方法时,这意味着一次只能有一个线程访问此方法。其他线程在同步方法解锁时等待

  4. # 4 楼答案

    我很确定这些答案,但我找不到一个好的来源

    第一个问题:
    synchronized将锁定TimerTask

    第二个问题:
    这是指TimerTask;如果想锁定包含的对象,可以使用MyContainingObject。这个