线程安全问题的分析及代码示例
2016-11-20 18:07
369 查看
资源类:Student
设置学生数据:SetThread(生产者)
获取学生数据:GetThread(消费者)
测试类:StudentDemo
* 线程安全问题的判断依据:
* A:是否是多线程环境
是
* B:是否有共享数据 是
* C:是否有多条语句操作共享数据 是
* 若同时满足以上三个条件,则可判定程序可能出现线程安全问题
*
* 如何实现资源共享呢?
* 在外界把这个共享资源创建出来,把这个共享资源作为参数传递给线程类的构造方法。
*
* 问题:为了数据的效果好一些,我加入了循环和判断,给出不同的值,这个时候产生了新的问题
* A:同一个数据出现多次
* B:姓名和年龄不匹配
* 原因:
* A:同一个数据出现多次
* CPU的一点点时间片的执行权,就足够执行很多次。
* B:姓名和年龄不匹配
* 线程运行的随机性
* 解决方案:
* 加锁。
* 注意:
* A:不同种类的线程都要加锁。
* B:不同种类的线程加的锁必须是同一把。
*/
设置学生数据: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(); } }
相关文章推荐
- 生产消费者模式实现方式和线程安全问题代码示例
- web.py 直接使用示例代码,web.application报错, 'module' object has no attribute 'application',问题原因分析
- 结构体中指针赋值问题的分析及C代码示例
- 结构体中指针赋值问题的分析及C代码示例
- Netty中TCP粘包问题代码示例与分析
- servlet与Struts action线程安全问题分析!(转)
- 大家来分析一下,下面代码的严重问题
- 大家来分析一下,下面代码的严重问题
- ASP.NET缓存方法分析和实践示例代码第1/2页
- servlet与Struts action线程安全问题分析
- silverlight3:sivlerlight.net 站点Navigation Framwork示例代码的问题
- OGRE示例Demo_BSP代码分析
- ASP.NET缓存方法分析和实践示例代码第1/2页
- MySQL union 语法代码示例分析
- 线程安全问题(根源) -------servlet与Struts action线程安全问题分析
- OGRE示例Demo_BSP代码分析
- 关于从NAND Flash启动的问题,2440 启动问题 , 拷贝4k程序 ,启动代码分析
- servlet与Struts action线程安全问题分析
- 下面的代码示例演示如何询问用户一个是与否的问题,并根据响应做出决定。
- 大家来分析一下,下面代码的严重问题