gpt4 book ai didi

java - Java中同步关键字的使用

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:33:39 24 4
gpt4 key购买 nike

我看过一些关于同步方法的文章(包括Oracle的),我不确定我是否理解正确。

我有以下代码:

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;
}
}

现在它所做的只是运动。我的理解是,当我的主窗体的键监听器注册 keyPressed 和 Released 事件时,setPressed 和 setReleased 是从主线程调用的。这段代码合理吗?是否正确使用 synchronized 关键字? (代码没有它也能工作,但我怀疑有它更好?)

最佳答案

不确定 Swing 方面的事情,但一般来说,您需要同步来保护那些可能被多个线程访问的共享数据(在您的情况下为 moving[])。

在这种情况下,您需要同步,因为 moving[] 可以通过 setXxx 方法(主线程)写入或由您启动的线程读取。

自 Java 5 以来,java.concurrent 包中的功能要好得多,我建议您考虑使用 Lock 来保护 moving[] 或 AtomicBoolean。

几个“风格问题”:

  1. 不要使用“原始类型”——更喜欢 Map 而不是 Map(这也可以避免 setXxxx() 方法中未经检查的丑陋转换)

    <
  2. 避免单行 if's -- 使您的代码难以辨认:)

如果您决定使用 Lock(在这种情况下与同步相比不是一个很大的优势)您的 isPressed() 应该类似于:

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

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

您必须通过调用 Lock.acquire() 和 release() 在 setXxx 方法中“包装”对 moving[] 的赋值

关于java - Java中同步关键字的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10759815/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com