黑马程序员技术交流社区

标题: 线程的安全问题 [打印本页]

作者: 张治国    时间: 2014-4-6 09:33
标题: 线程的安全问题
本帖最后由 张治国 于 2014-4-6 22:22 编辑

在我们查API的时候,都会看到这个线程安全,那个线程不安全的。
我们都知道变量有成员变量、局部变量,那么在多线程时,它们有线程安全和不安全的说法吗?请举例说明,谢谢

作者: haixian    时间: 2014-4-6 10:10
线程不安全主要是只数据不一致,因为对数据的操作不是原子操作,所以在多线程环境下可能出现数据不一之的错误,比如线程判断如果int i 没值就赋值1 否则加1,假设i原来没值那么正常结果应该是1,如果有两个这样的 线程,a,b,a判断i没值之后,cpu将线程执行权交给b,b首先判断i是否有值,没值,他给他赋值1.然后执行权交给a,a已经判断完了,给它赋值1,最后i的结果是1,但是如果a,b的操作都是原子操作的话那么,i的值应该是2,导致数据不一致,这就是我们说的线程安全把。
作者: haixian    时间: 2014-4-6 10:11
上面我说错了,线程调度应该不是由cpu来做的。而是java虚拟机
作者: 1453149997    时间: 2014-4-6 10:39
对于局部变量,因为每个线程调用方法的时候都会创建新的局部变量,所以它不存在线程安全问题;
但是对于成员变量就有可能存在线程安全问题,比如多个线程可能操作同一对象;
作者: 张治国    时间: 2014-4-6 11:46
谢谢  各位啦
作者: 黄泉    时间: 2014-4-6 12:08
线程安全问题主要是:多个线程操作同一代码,导致数据错乱。
如:毕老师视频里生产者与消费者。多个生产者与多个消费者,
要求是生产一个消费一个。
如果不使用synchronized或者Lock锁。
会出现生产多个商品,而只消费一个商品的问题。
因为,多线程的特性具备随机性。
谁抢到资源谁就执行,多久的话就是cpu说了算。
s1、s2是生产者。
s3、s4是消费者。
s1、s2生产2个产品,然后s3来消费。
这时,s1或者s2有可能再次获取了cpu的执行权。
就出现了与要求不符合的问题出现。生产与消费不均等。
想要避免多线的安全问题,就需要将多线程所执行的代码共享属性保护起来。
要注意的使用同步的前提:
1.至少要有2个或2个以上的线程
2.必须使用的是同一个锁。

如何给多线程添加锁:
1.明确多线程所执行的代码
2.明确多线程的共享属性
3.明确多线程所执行代码的共享属性

同步函数的锁是:this

静态同步函数的锁是:类名.class
作者: 水蓝    时间: 2014-4-6 12:47
判断是否存在线程安全问题,考虑以下两个要素:
1、是否存在两个或两个以上的线程在运行。
2、多个线程之间,是否存在共享空间。

以上两点,必须全部满足,才会需要考虑线程安全问题。
作者: zzmxhm    时间: 2014-4-6 17:50
线程安全指的是多个线程共享同一个数据对象时出现的数据不同步现象。这种现象可能会发生在两个层面,第一个是在程序层面,例如多个线程同时修改某个对象的值,但它们的修改操作不是原子性的,因而会产生不一致现象;另一个是指系统存储方面,现代计算机都有多级缓存,进而会出现缓存与内存中数据不一致的现象。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2