线程安全再思考

当多线程并发访问一个方法(函数)时的线程安全问题
       首先, 所有线程访问的是同一个方法吗? NO, 方法之于线程 就好像 程序之于进程一样,每一次执行都是独立的, 是在某一个数据集上的一次执行.
这样来看: 方法是一段程序代码,在内存某个空间,假设是0000H到0100H,线程a执行到0050H时被打断,
线程b开始从0000H执行,他们执行的是同一个方法吗? 的确是的, 他们都在执行相同的指令代码,但是,他们都是独立的执行工作在不同的数据集上(他们的外部环境不一样了),
当数据集相同时,那显然是线程安全的,n个线程一起执行,结果都一样.

显然线程安全问题的重点是数据集,那么考虑在不同数据集时的情况
       数据集包括: 方法里面定义的变量,调用的资源(比如new data())方法外面定义的成员变量, 对于方法里面定义的变量,每个线程是独一份的,是线程安全的..这些方法里定义的变量在线程被切换时会保护起来(压栈)也就是说线程切换不改变他自己定义的变量,而外部成员变量则不受方法管控,他对于方法来说是不确定的,线程切换时不会保存外部的变量(就算保存也只能保存一个瞬间), 那么显然线程安全问题主要在外部共享变量上.

结论

       方法里面定义的变量是线程独有并且安全的, 只有涉及到了共享资源和变量时才有线程安全问题. 所以外部共享数据不安全,当线程要互斥访问这些数据时,需要加入同步机制,

       常用的同步机制是加锁,而加锁可能会导致死锁,在使用锁时要注意避免死锁, 如何避免:摘自《操作系统》互斥的访问资源, 循环等待资源,持有且等待资源,不可剥夺资源, 这是发生死锁的必要条件.死锁的避免就是要破坏这4中条件之一.

posted @ 2018-03-27 13:40  zhangwang010  阅读(125)  评论(0)    收藏  举报