多线程 —— 使用锁编写线程安全的程序
2016-07-24 10:45
246 查看
对上一个例子的改进。
1、竞争资源
2、设置对象和获取对象的线程
为了展示效果,我们使用了循环。
3、测试方法
注意事项:锁对象,要是同一把,才能“锁”住。如果是不同的锁,锁的意义就不大了,锁对象可以是任意的对象。
我们这里使用的锁对象是 Student 对象。
1、竞争资源
public class Student { String name; Integer age; }
2、设置对象和获取对象的线程
为了展示效果,我们使用了循环。
public class SetThread implements Runnable { private Student student; // todo 这个初始化是很重要的 private Integer x=0; public SetThread(Student student){ this.student = student; } @Override public void run() { while (true){ synchronized (student){ if(x%2==0){ student.name = "liwei"; student.age = 29; }else { student.name = "yuanlian"; student.age = 26; } x++; } } } }
public class GetThread implements Runnable { private Student student; public GetThread(Student student){ this.student = student; } @Override public void run() { while (true){ // 只有一句,有必要同步吗 synchronized (student){ System.out.println(student.name + " --- " + student.age); } } } }
3、测试方法
注意事项:锁对象,要是同一把,才能“锁”住。如果是不同的锁,锁的意义就不大了,锁对象可以是任意的对象。
我们这里使用的锁对象是 Student 对象。
/** * Created by liwei on 16/7/18. */ /* * 分析: * 资源类:Student * 设置学生数据:SetThread(生产者) * 获取学生数据:GetThread(消费者) * 测试类:StudentDemo * * 问题1:按照思路写代码,发现数据每次都是:null---0 * 原因:我们在每个线程中都创建了新的资源,而我们要求的时候设置和获取线程的资源应该是同一个 * 如何实现呢? * 在外界把这个数据创建出来,通过构造方法传递给其他的类。 * * 问题2:为了数据的效果好一些,我加入了循环和判断,给出不同的值,这个时候产生了新的问题 * A:同一个数据出现多次 * B:姓名和年龄不匹配 * 原因: * A:同一个数据出现多次 * CPU的一点点时间片的执行权,就足够你执行很多次。 * B:姓名和年龄不匹配 * 线程运行的随机性 * 线程安全问题: * A:是否是多线程环境 是 * B:是否有共享数据 是 * C:是否有多条语句操作共享数据 是 * 解决方案: * 加锁。 * 注意: * A:不同种类的线程都要加锁。 * B:不同种类的线程加的锁必须是同一把。 */ /** * 本例子仅仅只是解决了安全的问题:解决办法:加锁 */ public class StudentDemo { public static void main(String[] args) { // 创建资源 Student s = new Student(); // 设置和获取的类 SetThread setThread = new SetThread(s); GetThread getThread = new GetThread(s); // 线程类 Thread t1 = new Thread(setThread); Thread t2 = new Thread(getThread); // 启动线程 t1.start(); t2.start(); } }
相关文章推荐
- Python3写爬虫(四)多线程实现数据爬取
- C#实现多线程的同步方法实例分析
- 浅谈chuck-lua中的多线程
- C#简单多线程同步和优先权用法实例
- C#多线程学习之(四)使用线程池进行多线程的自动管理
- C#多线程编程中的锁系统(三)
- 解析C#多线程编程中异步多线程的实现及线程池的使用
- C#多线程学习之(六)互斥对象用法实例
- 基于一个应用程序多线程误用的分析详解
- C#多线程学习之(三)生产者和消费者用法分析
- C#多线程学习之(一)多线程的相关概念分析
- C#多线程之Thread中Thread.IsAlive属性用法分析
- 分享我在工作中遇到的多线程下导致RCW无法释放的问题
- C#多线程编程之使用ReaderWriterLock类实现多用户读与单用户写同步的方法
- C#多线程传递参数及任务用法示例
- C#控制台下测试多线程的方法
- 21天学习android开发教程之SurfaceView与多线程的混搭
- Ruby 多线程的潜力和弱点分析
- C#中WPF使用多线程调用窗体组件的方法
- C#如何对多线程、多任务管理(demo)