您的位置:首页 > 编程语言

线程安全问题的分析及代码示例

2016-11-20 18:07 369 查看
资源类:Student

设置学生数据:SetThread(生产者)

获取学生数据:GetThread(消费者)

测试类:StudentDemo

 * 线程安全问题的判断依据:

 *  A:是否是多线程环境


 *  B:是否有共享数据  是

 *  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();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: