同步关键字是否阻止线程在锁定时使用自己的变量?

时间:2016-02-05 06:46:53

标签: java multithreading

让我们举一个例子:

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同步?

2 个答案:

答案 0 :(得分:0)

所以对于你的下一个问题 //如果是,有没有办法让变量c同步?

转到AtomicInteger,这将阻止竞争条件,

AtomicInteger c;

答案 1 :(得分:0)

你可以使C成为类DBServer的静态变量,这样所有线程都可以访问它。

现在,这将要求您更改method2()以进行同步。

如果您这样做,要在这些新条款下回答您的问题,用户0将无法在用户1的控制下更改变量C