如何判断多个线程是否共享资源
2015-10-09 12:08
246 查看
在一个程序中有多个线程,如何确定线程间操作的是不是一个资源(变量,内存)?
看不同的线程是否指向的同一个对象,如下图:
注意:Java中使用地址判断对象是否为同一个对象。地址相同就是同一个对象
如果把上面的例子中传递对象实例换成基本数据类型(int,byte,……)是不行的。因为基本数据类型赋值时传递的不是对象地址,而是新建一个基本类型然后赋值。也就是线程不能指向同意对象了。
看不同的线程是否指向的同一个对象,如下图:
注意:Java中使用地址判断对象是否为同一个对象。地址相同就是同一个对象
<span style="font-family:FangSong_GB2312;font-size:18px;">import org.junit.Test; public class Test1 { @Test public void pub() { // 建立三个不同的线程,同时修改num中的i变量 MyNum num = new MyNum(); AddNum add1, add2, add3; add1 = new AddNum(num); add2 = new AddNum(num); add3 = new AddNum(num); add1.start(); add2.start(); add3.start(); } } class MyNum { int number = 0; // 定义个计数器 String type = "整形"; } class AddNum extends Thread { MyNum my = new MyNum(); public AddNum(MyNum myNum) { // TODO Auto-generated constructor stub my = myNum; // 因为myNum是一个类,在传值和赋值是都是传递的地址 } public synchronized void addMethod() { // synchronized修饰保证一个线程修改number。 my.number++; System.out.println(my.number); } public void run() { while (true) { this.addMethod(); } } }</span>注意:
如果把上面的例子中传递对象实例换成基本数据类型(int,byte,……)是不行的。因为基本数据类型赋值时传递的不是对象地址,而是新建一个基本类型然后赋值。也就是线程不能指向同意对象了。
相关文章推荐
- Ruby中的变量学习总结
- C#线程间不能调用剪切板的解决方法
- 详解Lua中的变量相关知识点
- dos批处理文件中的变量小结
- 探索PowerShell(七) PowerShell变量
- VBScript教程 第四课VBScript变量
- 关于SQL 存储过程入门基础(基础知识)
- perl 变量 $/ 的用法解析 上下文为行模式时,$/ 定义以什么来区分行
- C#线程同步的三类情景分析
- C#获取进程或线程相关信息的方法
- C#停止线程的方法
- VBS教程:VBScript 基础-VBScript 变量
- C#子线程更新UI控件的方法实例总结
- C#线程队列用法实例分析
- Erlang语法学习笔记:变量、原子、元组、列表、字符串
- C++使用CriticalSection实现线程同步实例
- 基于C++实现的线程休眠代码
- mssql存储过程表名和字段名为变量的实现方法
- Shell脚本定义变量和重新赋值
- 深入理解C++编程中的局部变量和全局变量