此应用程序为其接收的每个连接启动一个新线程,在此示例中,2个客户端(连接)尝试将变量每次增加10次。
所以最后它应该是20,而不是它只有10。
服务器侦听器:
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(1994);
Socket socket=null;
while (true) {
socket = serverSocket.accept();
new TestingSession(socket).start();
}
}
服务器主题(会话)
class TestingSession extends Thread {
private Socket socket;
TestingSession(Socket socket) { this.socket = socket;}
public void run() {
try {
DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
while (!socket.isClosed()) {
dataOutputStream.writeInt(number.getI());
int i = dataInputStream.readInt();
number.setI(i);
System.out.println(i);
客户主要方法:
public class Run {
public static void main(String[] args) {
UpdateTest t1 = new UpdateTest();
UpdateTest t2 = new UpdateTest();
t1.start();
t2.start();
System.out.println("finished creation");
}
}
客户线程:
public class UpdateTest extends Thread {
public void run() {
try {
Socket socket;
socket = new Socket("127.0.0.1", 1994) ;
for(int i=0; i <10;i++){
int z=dataInputStream.readInt(); // read the static num
dataOutputStream.writeInt(z+1); // write it incremented one
}
socket.close();
} catch(Exception e){
System.out.println(e.getMessage());
}
}
}
我希望变量变为20,但它会在服务器端打印以下内容
1 1 2 2 3 3 .. 10 10
答案 0 :(得分:1)
从您提供的代码中,您似乎没有提供任何同步来更新和读取数字值。这就是你最终看不到20的原因。此代码应位于同步块内。
synchronized (number) {
dataOutputStream.writeInt(number.getI());
int i = dataInputStream.readInt();
number.setI(i);`
}