多线程 —— 使用锁编写线程安全的程序
来源:互联网 发布:mysql导出sql文件 编辑:程序博客网 时间:2024/05/23 15:48
对上一个例子的改进。
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(); }}
0 0
- 多线程 —— 使用锁编写线程安全的程序
- 编写线程安全的JSP程序
- 编写线程安全的JSP程序
- 编写线程安全的JSP程序
- 编写线程安全的JSP程序
- 编写线程安全的JSP程序
- 编写线程安全的JSP程序
- 编写线程安全的JSP程序
- 编写线程安全的JSP程序
- 编写线程安全的JSP程序
- 编写线程安全的JSP程序
- 编写线程安全的JSP程序
- 多线程要使用线程安全的函数
- 如何编写一个线程安全的程序或者函数库?
- 多线程程序中线程安全的操纵可视化控件
- CString使用(多线程、线程安全)
- Java多线程开发七——线程安全的数据结构
- 编写线程安全的JSP
- Ugly Number
- PHP函数之array_key_exists
- Pycharm Professional 激活服务器
- Hadoop--The Definitive Book_4th Contents
- 快排为什么那么快
- 多线程 —— 使用锁编写线程安全的程序
- NAT技术的原理
- 使用一个类代替资源文件代码
- MapReduce Main Points
- 学习与记忆
- Discuz! 更改用户名长度(代码和数据库字段)
- 基于python的数字判断程序和字符串判断程序
- 数据驱动测试一:使用TestNG进行数据驱动
- C语言中 fp = fopen(filename, “rb”); 那个rb是什么意思啊