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
,所以我不能