English 中文(简体)
Java 使用同步键字
原标题:Use of the Synchronized Keyword in Java

我读过一些关于同步方法的文章(包括甲骨文),

我有以下代码:

public class Player extends javax.swing.JLabel implements Runnable{
    private static int off2[] = {-1, 0, 1, 0}, off1[] = {0, 1, 0, -1};
    private static final Map dir = new java.util.HashMap<Integer, Integer>();
    static{
        dir.put(KeyEvent.VK_UP, 0);
        dir.put(KeyEvent.VK_RIGHT, 1);
        dir.put(KeyEvent.VK_DOWN, 2);
        dir.put(KeyEvent.VK_LEFT, 3);
    }
    private boolean moving[] = new boolean[4];

    @Override
    public void run(){
        while(true){
            for(Object i : dir.values()){
                if(isPressed((Integer)i)) setLocation(getX() + off1[(Integer)i], getY() + off2[(Integer)i]);
            }
            try{
                Thread.sleep(10);
            }catch(java.lang.InterruptedException e){
                System.err.println("Interrupted Exception: " + e.getMessage());
            }
        }
    }
    public void start(){
        (new Thread(this)).start();
    }

    private synchronized boolean isPressed(Integer i){
        if(moving[i]) return true;
        else return false;
    }

    public synchronized void setPressed(KeyEvent evt) {
        if(dir.containsKey(evt.getKeyCode()))moving[(Integer)dir.get(evt.getKeyCode())] = true;
    }
    public synchronized void setReleased(KeyEvent evt){
        if(dir.containsKey(evt.getKeyCode()))moving[(Integer)dir.get(evt.getKeyCode())] = false;
    }
}

现在它只是运动而已。我的理解是,装配和放放的数据集是从主线上调用的,而我的主要窗体的按键收听器记录了按键的按键和放行事件。这个代码合理吗?它是同步关键字的正确使用吗? (代码没有它就能工作,但我猜它最好有它? )

问题回答

不确定事物的摇摆侧面, 但一般而言, 您需要同步来保护共享数据( 移动中的数据), 这些数据可以通过多个线索访问 。

在此情况下, 您需要同步, 因为可使用 setXxx 方法( 主线) 或您开始的线索读取 。

自爪哇5以来, java. convent 包中的设施都好多了, 我建议你考虑使用锁来保护移动, 或者原子波来安。

几个“风格问题”:

  1. 不使用原始类型 -- 更喜欢 Map< Integer, Integer> 到 Map( 也使您从未选中的 - 以setXxxx () 方法中的 ug- 投影 )

  2. 如果 s -- -- 使您的代码无法辨认,则避免一行:)

如果您决定使用 Lock( 在本案中不是大优势还是同步), 您的 pressed () 应该像 :

// ...
private Lock movingLock = new ReentrantLock();

private  boolean isPressed(Integer i){
  try {
    movingLock.acquire();
    return moving[i];
  } finally
    movingLock.release();
  }        
}

您必须用 Lock. acre() 和 释放 () 的电话来包装在 setXxxx 方法中移动的任务

同步的使用是正确的,但我认为没有必要,因为在目前的实施中,平行访问阵列不会造成不一致。

然而,我认为您的代码中有一个不同的线索问题。 您不应该与 Swing (=call setlocation ()) 和另外的线索互动, 见< a href="http://docs. oracle.com/javase/ 1. 4.2/docs/ api/javax/ swing/ SwindUtiliities.html#invokeLater(java. lang. runnable)" rel="nofollow" >http://docs. oracle.com/javax/swing/ SwindUtilities.html#invokeLater(java. lang. Runnable) < /a>。 所以您需要将更新的代码包成可运行的代码 :

private boolean moving[] = new boolean[4];
Runnable dirUpdate = new Runnable() {
  for(Object i : dir.values()){
    if(isPressed((Integer)i)) setLocation(getX() + off1[(Integer)i], getY() + off2[(Integer)i]);
  }
};

从线条上引用的话会看起来是这样的:

SwingUtils.invokeLater(dirUpdate);

请注意,在此情况下,您不再需要同步, 因为会从事件处理线索中调用 dirUndate 。

您可能想要在按键 () 中检查无效, 以避免未标出密钥的例外 。

运动的一个较简单的表述可能是,按关键事件确定Dx和dy变量为-1、1或0。





相关问题
Spring Properties File

Hi have this j2ee web application developed using spring framework. I have a problem with rendering mnessages in nihongo characters from the properties file. I tried converting the file to ascii using ...

Logging a global ID in multiple components

I have a system which contains multiple applications connected together using JMS and Spring Integration. Messages get sent along a chain of applications. [App A] -> [App B] -> [App C] We set a ...

Java Library Size

If I m given two Java Libraries in Jar format, 1 having no bells and whistles, and the other having lots of them that will mostly go unused.... my question is: How will the larger, mostly unused ...

How to get the Array Class for a given Class in Java?

I have a Class variable that holds a certain type and I need to get a variable that holds the corresponding array class. The best I could come up with is this: Class arrayOfFooClass = java.lang....

SQLite , Derby vs file system

I m working on a Java desktop application that reads and writes from/to different files. I think a better solution would be to replace the file system by a SQLite database. How hard is it to migrate ...

热门标签