我也不完全理解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();
}
}
}
挥发性
Volatile在Java中被用作Java编译器和线程的指示器,这些编译器和线程不缓存该变量的值,并且总是从主存中读取它。
在这个代码示例中,一个线程(游戏线程)可以缓存"运行"的值,而不是每次从主内存中获取它,如果在任何其他线程之间改变值;这个线程不会看到它。将布尔变量"running"在java中设置为volatile可确保不会发生这种情况。
同步
使用Synchronized使你的方法线程安全。
编辑:长答案如下。
如果你的代码是在多线程环境中执行的,那么你需要对多线程共享的对象进行同步,以避免任何状态损坏或任何类型的意外行为。
Java中的synchronized关键字提供了锁,保证了共享资源的互斥访问,防止了数据竞争。此外,线程需要在访问同步的代码块之前获得锁。
同步可以在整个方法或特定块中完成。这个例子展示了方法同步。意味着整个方法被锁定,在任何时候只有一个线程可以访问你的方法。
不建议使用方法同步,因为它可能会降低性能。还有其他的优点和缺点,我没有在这个回复中讨论。