-1

我也不完全理解 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();
        }

    }

}
4

1 回答 1

2

易挥发的

Java 中的 Volatile 用作 Java 编译器和线程的指示器,它们不缓存此变量的值并始终从主内存中读取它。

在这个代码示例中,一个线程(游戏线程)可以缓存“正在运行”的值,而不是每次都从主内存中获取它,并且如果在任何其他线程之间更改该值;该线程将看不到它。在 java 中将布尔变量“ running ”设置为 volatile 可确保不会发生这种情况。

同步的

同步用于使您的方法线程安全。

编辑:长答案如下。

如果您的代码在多线程环境中执行,您需要对在多个线程之间共享的对象进行同步,以避免任何状态损坏或任何类型的意外行为。

java中的synchronized关键字提供了锁定,确保共享资源的互斥访问并防止数据竞争。在访问同步的代码之前,线程还需要获取锁。

可以对整个方法或特定块进行同步。该示例显示了方法同步。意味着整个方法被锁定,并且在任何时候只有一个线程可以访问您的方法。

不建议使用方法同步,因为它可能会降低性能。此回复中未涵盖其他优点和缺点。

于 2013-01-06T10:34:48.780 回答