资源类:Student
设置学生数据:SetThread(生产者)
获取学生数据:GetThread(消费者)
测试类:StudentDemo
* 线程安全问题的判断依据:
* A:是否是多线程环境 是
* C:是否有多条语句操作共享数据 是
* 若同时满足以上三个条件,则可判定程序可能出现线程安全问题
** 如何实现资源共享呢?
* 在外界把这个共享资源创建出来,把这个共享资源作为参数传递给线程类的构造方法。
*
* 问题:为了数据的效果好一些,我加入了循环和判断,给出不同的值,这个时候产生了新的问题
* A:同一个数据出现多次
* B:姓名和年龄不匹配
* 原因:
* A:同一个数据出现多次
* CPU的一点点时间片的执行权,就足够执行很多次。
* B:姓名和年龄不匹配
* 线程运行的随机性
* 解决方案:
* 加锁。
* 注意:
* A:不同种类的线程都要加锁。
* B:不同种类的线程加的锁必须是同一把。
*/
public class Student {
String name;
int age;
}
public class SetThread implements Runnable
{
Student s;
int x=1;
public SetThread(Student s) {
this.s=s;
}
public void run() {
while(true){
synchronized(s){
if(x%2==1){
s.name="LS";
s.age=22;
}else{
s.name="YZ";
s.age=24;
}
}
x++;
}
}
}
public class GetThread implements Runnable{
Student s;
public GetThread(Student s){
this.s=s;
}
public void run() {
while(true){
synchronized(s)
{
System.out.println(s.name+"今年"+s.age+"岁");
}
}
}
}
public class StudentDemo {
public static void main(String[] args) {
Student s =new Student();
SetThread st=new SetThread(s);
GetThread gt=new GetThread(s);
Thread t1=new Thread(st);
Thread t2=new Thread(gt);
t1.start();
t2.start();
}
}