sách gpt4 ai đã đi

java - 一个关于多线程的Java初学者问题

In lại 作者:行者123 更新时间:2023-12-02 01:35:07 26 4
mua khóa gpt4 Nike

在多年没有使用 Java 之后,我正在提高我的 Java 技能。最近,我正在阅读有关多线程的一章,其中提到:

“但是,如果您有一个访问静态字段的非静态方法怎么办?或者访问非静态字段的静态方法(使用实例)?在在这些情况下,事情很快就会变得困惑,而且很有可能事情不会按照你想要的方式进行。如果您有一个静态方法来访问非静态字段,并且您同步该方法,您就获得了该类的锁目的。但是如果有另一种方法也访问非静态字段怎么办?这次使用非静态方法?它可能会同步当前实例(this)代替。 记住静态同步方法和非静态同步方法不会互相阻塞——它们可以运行在同时。

为了学习,我一直在尝试编写一个示例,其中引用了上面代码片段中的场景:一个程序,其中静态同步方法修改与非同步方法。

到目前为止,我还没有成功做到这一点。感谢您的帮助。谢谢!

下面是我完成的代码示例。然而,正如预期的那样,线程不会同时运行,因为它们是同步的。我只是想看看书中提到的一个例子,这样我就知道不该做什么。

class code147_class1{
int num1 = 111;
static int num2 = 222;

}//code147_class1


public class code147 implements Runnable {

code147_class1 z = new code147_class1();

public static void main (String args[]){
System.out.println("Program has started...");
System.out.println("The value of the instance variable is:"+new code147_class1().num1);
System.out.println("The value of the static variable is:"+code147_class1.num2);

code147 cd1 = new code147();

Thread thread1 = new Thread(cd1);
Thread thread2 = new Thread(cd1);

thread1.start();
thread2.start();


}//main

public void run(){
System.out.println("Thread has started for:"+Thread.currentThread().getId());

try{
subtract_instance_var(z);
Thread.sleep(100);
code147.static_subtract_instance_var(z);
}
catch(Exception ex){

}
}//run

public synchronized void subtract_instance_var(code147_class1 x){
if(x.num1 ==111){

try{
Thread.sleep(100);
}
catch(Exception ex){
}

x.num1 = x.num1 - 11;
System.out.println("Value is subtracted at thread:"+Thread.currentThread().getId());

}//if

System.out.println("The value of instance variable at the end for thread: "+Thread.currentThread().getId()+" is "+x.num1);

}//subtract_instance_var

public synchronized static void static_subtract_instance_var(code147_class1 x){
if (x.num1==111){
try{
Thread.sleep(100);
}
catch(InterruptedException ex){
}//catch
x.num1 = x.num1 -11;
System.out.println("Value is subtracted at thread:"+Thread.currentThread().getId());
}//if

System.out.println("STATIC The value of instance variable at the end for thread: "+Thread.currentThread().getId()+" is "+x.num1);

}//stati_subtract_var

}//class

运行代码后,我预计实例变量的值为 89。但程序结果为 100。

1 Câu trả lời

你得到的结果100是正确的。thread1和thread2将同时运行。由于“subtract_instance_var”方法是同步的,一个线程将使变量变为100。然后该线程将进入休眠状态。当锁被释放时,其他线程可以执行“subtract_instance_var”。但当“x.num1==111”条件失败时,什么也不会发生。 sleep 后,当两个线程尝试执行“static_subtract_instance_var”方法时,“x.num1==111”条件仍然失败。因此变量值仍为 100。

关于java - 一个关于多线程的Java初学者问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55351694/

26 4 0
Bài viết được đề xuất: JavaFX 捆绑 exe 不显示 TableView 内容
Bài viết được đề xuất: email - 开源 JMAP 兼容服务器?
Bài viết được đề xuất: ftp - 如何使用 ftp (/usr/bin/ftp) 匿名登录?
Bài viết được đề xuất: docusignapi - Docusign 代表发送 (SOBO)
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com