gpt4 book ai didi

java - 这个 "synchronized"可以工作吗?

转载 作者:行者123 更新时间:2023-12-02 08:31:08 24 4
gpt4 key购买 nike


1.这里使用synchronized的方式是否正确?
2.一个线程访问randomScore时是否会被锁定,导致其他线程无法访问randomScore?
3.如果只有changeRandomScore()可以访问randomScore变量,并且只有一个线程可以访问changeRandomScore(),那么一次只有一个线程可以访问randomScore。这是对的吗?

    import java.*;


public class StudentThread extends Thread {
int ID;
public static int randomScore;

StudentThread(int i) {
ID = i;
}

public void run() {
changeRandomScore();

System.out.println("in run");
}
public synchronized void changeRandomScore() {
randomScore = (int) (Math.random()*1000);
}
public static void main(String args[]) throws Exception {
for (int i = 1;i< 10 ;i++)
{
StudentThread student = new StudentThread(5);

student.start();
Thread.sleep(100);
System.out.println(randomScore);
}
}
}

最佳答案

您正在访问不同对象的同步方法内的静态变量。同步在这里没有实际效果,因为每个线程都使用自己的监视器(在本例中为线程对象)。对于共享变量,您也应该使用共享监视器。

这是一个正确同步的变体:

public class StudentThread extends Thread {
int ID;
private static int randomScore;
private static final Object scoreLock = new Object();

StudentThread(int i) {
ID = i;
}

public void run() {
changeRandomScore();

System.out.println("in run");
}
public void changeRandomScore() {
int tmp = (int) (Math.random()*1000);
// no need to synchronize the random()-call, too.
synchronized(scoreLock) {
randomScore = tmp;
}
}
public static void main(String args[]) throws Exception {
for (int i = 1;i< 10 ;i++)
{
StudentThread student = new StudentThread(5);

student.start();
Thread.sleep(100);
synchronized(scoreLock) {
System.out.println(randomScore);
}
}
}
}

不同的是,我们现在使用一个公共(public)锁对象(scoreLock)并将其用作同步块(synchronized block)的参数,并且我们还在读取分数的主方法中同步该对象.

或者,我们也可以声明方法 public static Synchronized void changeRandomScore() (这意味着它使用类对象作为监视器),并在主方法中在 StudentThread 上同步。类

是的,正如其他人所说:如果您想确保仅在正确同步的情况下访问变量,请不要将其设为public

关于java - 这个 "synchronized"可以工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4987716/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com