关于线程安全的问题变量定义的问题

public class Student {
boolean flag ;//这里定义一个boolean变量
String name;
int age;

}
public class GetStudent implements Runnable{

private Student s;
public GetStudent(Student s){
this.s = s;
}

@Override
public void run() {

    while(true){
        synchronized (s){
            if(!s.flag)     //这里怎么看他是这个flag就表示数据有无视屏解释是默认是没有数据false
                                //有数据就是true,不太理解我明白
            {
                try {
                    s.wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        System.out.println(s.name+"--"+s.age);
        s.flag = false;
        s.notify();
        }
    }
}

2个回答

boolean 初始化时是 falst

Student 类中的 flag是一个标记,

一开始 如果,,,new Student();,,,,此时什么都没有传,flag是falst
当传值的时候需要先把 flag 设置为true,,表示有学生信息,(这个过程是需要程序做的,不是自动的)

 if(!s.flag)     //这里怎么看他是这个flag就表示数据有无视屏解释是默认是没有数据false
                                //有数据就是true,不太理解我明白
            {
                try {
                    s.wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

这个判断是 ,,如果没有数据 s.wait()释放,,释放这里的锁 synchronized (s)

还有什么问题可以继续追问,,,如果帮到你了,,给个采纳...............^.^

我的理解是:当你传student 对象到线程里时,如果这个对象的flag=true,那么就不进入if 进而执行 System.out.println(s.name+"--"+s.age)。
如果你传的对象中的flag=false, 那么线程代码就会进入if,这时候 执行s.wait(),释放锁,从而不不不不不不会执行System.out.println(s.name+"--"+s.age)了

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐