Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java synchronize关键字是否阻止线程在锁定时使用自己的变量?_Java_Multithreading - Fatal编程技术网

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

Java synchronize关键字是否阻止线程在锁定时使用自己的变量?,java,multithreading,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) {

让我们举一个例子:

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
公共类DBServer{
静态布尔侦听=false;
私有静态ServerSocket ServerSocket=null;
私有静态套接字clientSocket=null;
静态列表用户=null;
公共静态void main(字符串[]args){
users=newlinkedlist();
int portNumber=0;//一些有效的端口号
System.out.println(“现在使用端口号=“+portNumber”);
试一试{
serverSocket=新的serverSocket(端口号);
}捕获(IOE异常){
系统输出打印ln(e);
}
边听{
试一试{
System.out.println(“连接的用户数:+users.size());
clientSocket=serverSocket.accept();
System.out.println(“某人刚刚加入”);
ClientThread ct=新的ClientThread(clientSocket);
用户。添加(ct);
ct.start();
}捕获(IOE异常){
系统输出打印ln(e);
}
}
}
}//下课
公共类ClientThread扩展线程{
int c=0;
//其他一些变量
客户端线程(套接字s){
this.clientSocket=s;
}
无效剂量测定法(){
ClientThread ct=DBServer.users.get(0);
同步(ct){
C++上的其他操作
}
}
void方法2(){
C++上的其他操作
}
//其他一些方法
公开募捐{
//一些永无止境的逻辑决定调用哪个方法
}
}//下课
假设在给定时间有3个用户(用户0、用户1、用户2)连接到服务器。

用户1获得用户0的对象的内部锁。可以肯定的是,当用户1仍然拥有用户0的锁时,用户2无法获得该锁。当用户1持有锁时,用户0自己能否使用
method2()
更改
c
的值?如果是这样的话,有没有办法使拥有变量c的线程和其他线程之间的
变量c
同步?

//如果是这样,有没有办法使变量c同步

选择AtomicInteger,它将阻止竞争条件


原子整数c

那么下面的问题呢 //如果是这样,有没有办法使变量c同步

选择AtomicInteger,它将阻止竞争条件


原子整数c

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

现在,这需要您将
method2()
更改为同步


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

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

现在,这需要您将
method2()
更改为同步


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

否。它只是防止另一个线程在同一个变量上同步。@Andy Turner,这太糟糕了,您能确认Jon Skeet的这篇文章的回答能解决我的问题吗?为了加本皇帝的爱:请摆脱
while(true)
死锁,这是最糟糕的代码,除了lazyness@specializt我看不出它有什么问题,它是一个服务器,应该在未来的连接中保持活动状态。你能告诉我哪里出了问题,解决办法是什么吗?“为了未来的联系而活着”根本不是造成僵局的理由。只需在其中放置一个可以从其他线程设置的标志-该标志的实际使用可能会在某个时候添加,但您确实需要避免这样的死锁,它们总是会在某个点中断您的应用程序,无论您可能插入多少
break
语句-原因是。。。复杂,需要几页的解释,但它确实存在。使用
静态
原子布尔
,例如。。。不难。它只是防止另一个线程在同一个变量上同步。@AndyTurner太差劲了,你能确认Jon Skeet的这篇文章的答案能解决我的问题吗?为了加本皇帝的爱:请摆脱
while(true)
死锁,这是最糟糕的代码,除了lazyness@specializt我看不出它有什么问题,它是一个服务器,应该在未来的连接中保持活动状态。你能告诉我哪里出了问题,解决办法是什么吗?“为了未来的联系而活着”根本不是造成僵局的理由。只需在其中放置一个可以从其他线程设置的标志-该标志的实际使用可能会在某个时候添加,但您确实需要避免这样的死锁,它们总是会在某个点中断您的应用程序,无论您可能插入多少
break
语句-原因是。。。复杂,需要几页的解释,但它确实存在。使用
静态
原子布尔
,例如。。。这并不难。很抱歉,我没有正确表达这个问题,我现在更新了它,不确定你的答案是否仍然有效。Atmoic变量会降低问题发生的概率,但不能保证问题会被排除。很抱歉,我没有正确表达这个问题,我现在更新了它,不确定你的答案是否仍然有效。Atmoic变量将降低问题发生的概率,但不能保证它会在我的真实代码中消除,有一个
ObjectOutputStream
的对象需要属于该线程,为了简单起见,我在这里称之为
c
,所以我不能