[英]Sharing an object between two threads and main program
我是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
。 如果取消注釋synchronized塊,代碼將無錯運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.