我刚学Java,正在上并发编程课程。我急需一个最小的工作示例,可以帮助演示我所学的概念,例如使用“synchronized”关键字和在线程之间共享对象。我一直在搜索,但找不到基本框架。Java程序员,请帮忙。
我刚学Java,正在上并发编程课程。我急需一个最小的工作示例,可以帮助演示我所学的概念,例如使用“synchronized”关键字和在线程之间共享对象。我一直在搜索,但找不到基本框架。Java程序员,请帮忙。
public class Game {
public static void main(String[] args) {
Ball gameBall = new Ball();
Runnable playerOne = new Player("Pasha", gameBall);
Runnable playerTwo = new Player("Maxi", gameBall);
new Thread(playerOne).start();
new Thread(playerTwo).start();
}
}
public class Player implements Runnable {
private final String name;
private final Ball ball;
public Player(String aName, Ball aBall) {
name = aName;
ball = aBall;
}
@Override
public void run() {
while(true) {
ball.kick(name);
}
}
}
public class Ball {
private String log;
public Ball() {
log = "";
}
//Removing the synchronized keyword will cause a race condition.
public synchronized void kick(String aPlayerName) {
log += aPlayerName + " ";
}
public String getLog() {
return log;
}
}
final int[] arr = new int[100];
Thread one = new Thread() {
public void run() {
// synchronized (arr) {
for (int i = 0; i < arr.length * 100000; i++) {
arr[i % arr.length]--;
}
// }
}
};
Thread two = new Thread() {
public void run() {
// synchronized (arr) {
for (int i = 0; i < arr.length * 100000; i++) {
arr[i % arr.length]++;
}
//}
}
};
one.start();
two.start();
one.join();
two.join();
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
但是,如果你在循环中同步arr
,你将总是在打印输出中看到所有的0
。如果你取消注释同步块,代码将可以正常运行。
arr
来消除错误:http://pastebin.com/vN4E527P 这强调了唯一不安全的线程部分就是这两行。 - Daniel Trebbien0
。 - jjnguy
ArrayList<String>
中。这是我最初考虑的一个很好的例子(即两个线程在没有适当同步的情况下调用同一对象上的线程不安全方法)。 - Daniel Trebbien