小编Luc*_*cky的帖子

为什么Java中的变量不是默认的volatile?

可能类似的问题:

你在Java中使用volatile关键字吗?


今天我正在调试我的游戏; 它有一个非常困难的线程问题,每隔几分钟就出现一次,但很难重现.所以首先我将synchronized关键字添加到我的每个方法中.那没用.然后我将volatile关键字添加到每个字段.问题似乎只是解决了问题.

经过一些实验,我发现负责的领域是一个GameState跟踪我的游戏当前状态的对象,可以是正在播放也可以是忙碌.忙时,游戏会忽略用户输入.我所拥有的是一个不断更改state变量的线程,而Event线程读取state变量.但是,在一个线程更改变量后,另一个线程需要几秒钟来识别更改,这最终会导致问题.

它是通过制作状态变量来修复的volatile.

为什么volatile默认情况下不是Java中的变量,以及不使用volatile关键字的原因是什么?

java multithreading volatile

12
推荐指数
5
解决办法
5482
查看次数

实现游戏播放的最佳方式?

我正在用Java创建一个基于网格的游戏,我想实现游戏录制和播放.我不知道怎么做,虽然我已经考虑了两个想法:

  1. 每秒几次,我会记录整个游戏状态.为了回放它,我写了一个渲染器来读取状态并尝试创建一个可视化表示.但是,有了这个,我可能会有一个大的保存文件,任何播放尝试都可能会有明显的延迟.

  2. 我也可以将每个按键和鼠标点击写入保存文件.这会给我一个较小的文件,并可以减少滞后回放.然而,游戏开始时的最轻微错误(例如,1毫秒后拍摄)将导致游戏几分钟内完全不同的游戏状态.

那么,实现游戏播放的最佳方式是什么?

编辑 - 我不确定我的游戏究竟有多确定,所以我不确定整个游戏是否只​​能通过按键和鼠标点击来拼凑.

java playback recording

11
推荐指数
2
解决办法
1301
查看次数

为什么applet不需要main()?

这适用于Applet,Servlet,Midlet等的子类.

为什么他们不需要main()?如果我想创建一个Craplet始于类init()或类似的东西,它是不好的设计,不然我怎么会去这样做呢?

java applet program-entry-point

11
推荐指数
2
解决办法
2万
查看次数

如何判断按下哪个SHIFT键?

在我的游戏中,我希望能够使用右移和左移键来实现不同的功能.在Java(或其他语言)中,有没有办法区分这两者?

KeyEvent类只有VK_SHIFT,它对应左右Shift键.同样的,Control,Alt,Enter,等.

我主要担心的是有人可能会用两根手指同时快速按下两个按键,从而获得不公平的优势.我应该关注这件事吗?

java keyboard

9
推荐指数
1
解决办法
5875
查看次数

拥有良好Java支持的最佳在线评判?

我想知道什么是一个很好的在线判断只是练习算法.我目前不是很擅长编写算法,所以可能一些简单(而且最不令人沮丧)会很好.

我已经尝试了UVA在线评判,但我花了大约20次试图让第一个例子问题正确; 绝对没有关于如何阅读输入等的文档.我读过有关Topcoder的内容,但我并不是真的想要竞争,只是为了练习.

java

9
推荐指数
1
解决办法
3399
查看次数

Python:如何在map()函数中放置构造函数?

假设我有一个类,带有一个带整数的构造函数.我有一个整数列表.如何使用map()此类的对象列表创建,每个对象都使用各自的整数构造?

python functional-programming

9
推荐指数
1
解决办法
2639
查看次数

哈斯克尔:显示搞砸了?

Haskell中的show函数似乎没有做它应该做的事情:

Prelude> let str = "stack\n\noverflow"
Prelude> putStrLn str
stack


overflow
Prelude> show str
"\"Stack\\n\\n\\noverflow\""
Prelude>
Run Code Online (Sandbox Code Playgroud)

当我声明函数时,我通常将类型签名设置为Show,它不能正确处理换行符.我希望它\n作为换行符,而不是字面意思"\n".当我将类型更改为String时,函数可以正常工作.但是我必须为整数,浮点数等实现一个单独的函数.

例如,我可以声明一个函数:

foo :: (Show x) => x -> IO ()
foo x = do
  putStrLn $ show x
Run Code Online (Sandbox Code Playgroud)

......并以这种方式称呼它:

foo "stack\n\noverflow"
foo 6
foo [1..]
Run Code Online (Sandbox Code Playgroud)

如何让函数返回预期的函数?即哪个函数类似show但可以返回包含换行符的字符串?

api haskell

8
推荐指数
2
解决办法
4783
查看次数

Java类加载运行速度极慢?

我正在尝试动态加载java .class文件并通过反射调用它.

我有一个名为Foo的课程; 它有一个空的构造函数,并有一个名为doit()的方法,它接受一个String参数并返回一个String.它也会反转字符串.

这是我的代码:

    URL url = new URL("file://C:/jtest/");
    URLClassLoader loader = new URLClassLoader(new URL[]{url});
    Class<?> cl = loader.loadClass("Foo");
    Constructor<?> cons = cl.getConstructor((Class[])null);
    Object ins = cons.newInstance(new Object[]{});
    Method meth = cl.getDeclaredMethod("doit", String.class);
    Object ret = meth.invoke(ins, new Object[]{"!dlroW olleH"});
    System.out.println((String)ret);
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,它打印出"Hello World!".但是,完成大约需要30秒.我知道反射很慢,但我希望它是10毫秒或者其他东西.

我正在使用Eclipse和JRE 1.6.0_13,我正在运行Windows Vista.

我在这做错了什么?

谢谢.

编辑:我已经分析了代码,并且它的所有时间都在第三行(loadClass())中使用.其他一切都会立即发生.

编辑:我把代码放在一个循环中; 慢速函数以某种方式得到优化,仅在第一个循环上需要30秒.

编辑:我找到了解决方案.

代替:

URL url = new URL("file://C:/jtest/");

我改成了:

URL url = new URL("file:/C:/jtest/");

现在它完美无缺.我不知道它为什么会起作用,但我不知道我(以及其他5个人)是如何错过的.现在我觉得愚蠢..

java reflection performance

7
推荐指数
3
解决办法
8294
查看次数

如何保护在线判断恶意代码?

Ideone站点中,用户上载要在远程服务器上运行的代码.这类似于在线法官的职能.

问题是用户可能会上传试图"破解"系统的代码.我知道在C和C++中很容易禁用某组系统调用(补丁几个.dll),但我对其他语言不太确定.

如果您在在线评判中支持更高级别的语言(Erlang,Haskell),您将如何保护您的系统?

security

7
推荐指数
1
解决办法
1065
查看次数

支持goto的Java编译器或JVM语言?

是否有一个java编译器标志允许我goto用作有效的构造?如果没有,是否有支持的第三方java编译器goto?如果没有,是否有任何其他语言支持,goto同时可以轻松调用用Java编写的方法?

原因是我正在制作一种用Java实现的语言.Gotos是我语言的重要组成部分; 我希望能够将其编译为本机或JVM字节码,尽管它必须能够轻松使用Java库(即C支持goto,但要使用它,我必须在C中重写库).

我想生成C或Java等源文件,而不是字节码或机器码.我正在使用第三方编译器来做到这一点.

java programming-languages language-design

5
推荐指数
2
解决办法
2447
查看次数