zoukankan      html  css  js  c++  java
  • java线程安全问题原理性分析

     

    1.什么是线程安全问题?

    从某个线程开始访问到访问结束的整个过程,如果有一个访问对象被其他线程修改,那么对于当前线程而言就发生了线程安全问题;如果在整个访问过程中,无一对象被其他线程修改,就是线程安全的。

    2.线程安全问题产生的根本原因

    1. 首先是多线程环境,即同时存在有多个操作者,单线程环境不存在线程安全问题。在单线程环境下,任何操作包括修改操作都是操作者自己发出的,操作者发出操作时不仅有明确的目的,而且意识到操作的影响。
    2. 多个操作者(线程)必须操作同一个对象,只有多个操作者同时操作一个对象,行为的影响才能立即传递到其他操作者。
    3. 多个操作者(线程)对同一对象的操作必须包含修改操作,共同读取不存在线程安全问题,因为对象不被修改,未发生变化,不能产生影响。

    综上可知,线程安全问题产生的根本原因是共享数据存在被并发修改的可能,即一个线程读取时,允许另一个线程修改。

    3.线程安全问题解决思路

    根据线程安全问题产生的条件,解决线程安全问题的思路是消除产生线程安全问题的环境:

    1. 消除共享数据:成员变量与静态变量多线程共享,将这些全局变量转化为局部变量,局部变量存放在栈,线程间不共享,就不存在线程安全问题产生的环境了。消除共享数据的不足:如果需要一个对象采集各个线程的信息,或者在线程间传递信息,消除了共享对象就无法实现此目的。
    2. 使用线程同步机制:给读写操作同时加锁,使得同时只有一个线程可以访问共享数据。如果单单给写操作加锁,同时只有一个线程可以执行写操作,而读操作不受限制,允许多线程并发读取,这时就可能出现不可重复读的情况,如一个持续时间比较长的读线程,相隔较长时间读取数组同一索引位置的数据,正好在这两次读取的时间内,一个线程修改了该索引处的数据,造成该线程从同一索引处前后读取的数据不一致。是同时给读写加锁,还是只给写加锁,根据具体需求而定。同步机制的缺点是降低了程序的吞吐量。
    3. 建立副本:使用ThreadLocal为每一个线程建立一个变量的副本,各个线程间独立操作,互不影响。该方式本质上是消除共享数据思想的一种实现。
  • 相关阅读:
    ssh批量远程执行脚本screen后台运行
    使用screen共享shell会话(终端共享)
    php获取一个月前的时间戳,获取三个月前的时间戳,获取一年前的时间戳
    jquery 鼠标经过延时触发事件,jquery插件
    jquery 克隆div 复制div 克隆元素 复制元素
    js实现一个可以兼容PC端和移动端的div拖动效果
    完美实现鼠标拖拽事件,解决各种小bug,基于jquery
    js将秒转换为 分:秒 函数
    php将秒转换为 分:秒 函数
    phpStudy启动失败时的解决方法 提示缺vc9运行库
  • 原文地址:https://www.cnblogs.com/tonghun/p/7156739.html
Copyright © 2011-2022 走看看