我也不完全了解volatile和synchronized修饰符的作用。但基本上这应该是我从youtube系列中学习的游戏的开始,到目前为止所做的一切都是启动一个有一个while循环的线程,内部运行方法更新和渲染。事情是除了设置颜色和创建矩形之外,我不了解渲染方法中的任何内容。
package game;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import javax.swing.JFrame;
public class Game implements Runnable {
public static Thread Game;
public volatile boolean running = false;
public void start() {
running = true;
Game = new Thread(this);
Game.start();
}
public synchronized void stop() {
running = false;
try {
Game.join();
} catch (InterruptedException e) {
System.out.println("asddsa");
}
}
public void update() {
}
public void render() {
BufferStrategy bs = GameFrame.GraphicsBoard.getBufferStrategy();
if (bs == null) {
GameFrame.GraphicsBoard.createBufferStrategy(3);
return;
}
Graphics g = bs.getDrawGraphics();
g.setColor(Color.BLACK);
g.fillRect(0, 0, GameFrame.GraphicsBoard.getWidth(),
GameFrame.GraphicsBoard.getHeight());
g.dispose();
bs.show();
}
public synchronized void run() {
new GameFrame();
while (running) {
update();
render();
}
}
}
答案 0 :(得分:2)
的挥发性强> 的
Java中的Volatile用作Java编译器和Thread的指示符,它不缓存此变量的值,并始终从主内存中读取它。
在这个代码示例中,一个线程(游戏线程)可以缓存“运行”的值,而不是每次都从主内存中获取它,如果在任何其他线程之间更改了值;它不会被这个帖子看到。在java中将boolean变量“ running ”设置为volatile可确保不会发生这种情况。
Synchronized用于使您的方法线程安全。
编辑:如下所示的长答案。
如果您的代码在多线程环境中执行,则需要同步多个线程之间共享的对象,以避免任何状态损坏或任何类型的意外行为。
java中的synchronized关键字提供锁定,确保共享资源的互斥访问并防止数据竞争。线程还需要在访问同步的代码之前获取锁。
可以对整个方法或特定块进行同步。该示例显示了方法同步。意味着整个方法被锁定,并且在任何时候只有一个线程可以访问您的方法。
不建议进行方法同步,因为它可能会降低性能。本回复中还有其他优点和缺点。