让我们举一个例子:
public class DBServer {
static boolean listening = false;
private static ServerSocket serverSocket = null;
private static Socket clientSocket = null;
static List<ClientThread> users = null;
public static void main(String[] args) {
users= new LinkedList();
int portNumber = 0;//some valid port number
System.out.println("Now using port number=" + portNumber);
try {
serverSocket = new ServerSocket(portNumber);
} catch (IOException e) {
System.out.println(e);
}
while (listening) {
try {
System.out.println("Number of users connected: " + users.size());
clientSocket = serverSocket.accept();
System.out.println("Someone just joined.");
ClientThread ct= new ClientThread(clientSocket);
users.add(ct);
ct.start();
}catch (IOException e) {
System.out.println(e);
}
}
}
}//End of class
public class ClientThread extends Thread {
int c = 0;
//some other variables
ClientThread(Socket s){
this.clientSocket= s;
}
void doSomething(){
ClientThread ct = DBServer.users.get(0);
synchronized(ct){
ct.c++;//or some other operation on c
}
}
void method2(){
c++;//or some other operation on c
}
//some other methods
public void run(){
//some never ending logic that decides which method is being called
}
}//End of class
假设在给定时间有3个用户(用户0,用户1,用户2)连接到服务器。
用户1获得用户0的对象的固有锁定。当用户1仍然拥有它时,用户2肯定无法获得用户0的锁定。当用户1持有锁定时,用户0自己可以使用c
更改method2()
的值吗?如果是这样,有没有办法让拥有它的线程和其他线程之间的variable c
同步?
答案 0 :(得分:0)
所以对于你的下一个问题 //如果是,有没有办法让变量c同步?
转到AtomicInteger,这将阻止竞争条件,
AtomicInteger c;
答案 1 :(得分:0)
你可以使C
成为类DBServer
的静态变量,这样所有线程都可以访问它。
现在,这将要求您更改method2()
以进行同步。
如果您这样做,要在这些新条款下回答您的问题,用户0将无法在用户1的控制下更改变量C
。