什么是线程安全和线程不安全
首先要明白线程的工作原理,jvm有一个main memory,而每个线程有自己的working memory,一个线程对一个variable进行操作时,都要在自己的working memory里面建立一个copy,操作完之后再写入main memory。多个线程同时操作同一个variable,就可能会出现不可预知的结果。根据上面的解释,很容易想出相应的scenario。
而用synchronized的关键是建立一个monitor,这个monitor可以是要修改的variable也可以其他你认为合适的object比如method,然后通过给这个monitor加锁来实现线程安全,每个线程在获得这个锁之后,要执行完 load到workingmemory -> use&assign -> store到mainmemory 的过程,才会释放它得到的锁。这样就实现了所谓的线程安全。
------------------------------------------------------
什么是线程安全?线程安全是怎么完成的(原理)?
线程安全就是说多线程访问同一代码,不会产生不确定的结果。编写线程安全的代码是低依靠线程同步。
------------------------------------------------------
在接口方式中,线程有一个共享的数据成员,即:
private int count =10;
而在继承方式中,线程之间没有共享的成员,而是各线程各自有一个私有成员,即:
private int count =10;
楼主的代码刚好是一个好例子,说明了何时需要考虑线程同步,并在一定程序上说明了怎样才能编写出线程安全的代码。
在多线程环境中,当各线程不共享数据的时候,那么一定是线程安全的。问题是这种情况并不多见,在多数情况下需要共享数据,这时就需要进行适当的同步控制了。
--------------------------------------------------------
线程安全一般都涉及到synchronized
就是一段代码同时只能有一个线程来操作
不然中间过程可能会产生不可预制的结果
---------------------------------------------------------
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
举例 比如一个 ArrayList 类,在添加一个元素的时候,它可能会有两步来完成:1. 在 Items[Size] 的位置存放此元素;2. 增大 Size 的值。
在单线程运行的情况下,如果 Size = 0,添加一个元素后,此元素在位置 0,而且 Size=1;
而如果是在多线程情况下,比如有两个线程,线程 A 先将元素存放在位置 0。但是此时 CPU 调度线程A暂停,线程 B 得到运行的机会。线程B也向此 ArrayList 添加元素,因为此时 Size 仍然等于 0 (注意哦,我们假设的是添加一个元素是要两个步骤哦,而线程A仅仅完成了步骤1),所以线程B也将元素存放在位置0。然后线程A和线程B都继续运行,都增加 Size 的值。
那好,现在我们来看看 ArrayList 的情况,元素实际上只有一个,存放在位置 0,而 Size 却等于 2。这就是“线程不安全”了。
分享到:
相关推荐
Servlet 线程安全问题是指在使用 Servlet 编程时,如果不注意多线程安全性问题,可能会导致难以发现的错误。Servlet/JSP 技术由于其多线程运行而具有很高的执行效率,但这也意味着需要非常细致地考虑多线程的安全性...
mysql是线程不安全的,mysql不是线程安全的,多线程共用同一个mysql连接是会崩溃的 QT的QSqlDatabase是基于mysql的,所以一样是线程不安全的 现讲明mysql为什么是线程不安全的,以及在多线程环境下如何使用mysql,...
但是需要注意,虽然这个方法可以保证基本的线程安全,但迭代仍然是非线程安全的,即不能在遍历过程中修改Map。 2. 使用ConcurrentHashMap:Java从1.5版本开始引入了ConcurrentHashMap,它是线程安全且高并发性能的...
什么是线程安全? 答:线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等...
然而,List并未设计为线程安全的容器,这意味着在多个线程同时访问和修改List时,可能会引发数据竞争和不一致的情况。标题中提到的“List添加对象的误区”主要体现在多线程环境下对List<T>.Add()方法的并发调用。 ...
线程安全变量则可以确保在多线程环境下,即使不使用锁,也可以安全地更新和读取这些变量。 在LabWindows/CVI的`多线程_线程锁_线程安全变量`示例中,你可能会发现以下几个关键点: 1. **线程创建与销毁**:使用`...
分析这个文件可以帮助我们更好地理解线程安全问题的实际表现和解决方案。 总的来说,理解`SimpleDateFormat`的线程不安全性质是Java开发中的一项重要知识,特别是在设计高并发系统时。开发者应当根据具体需求选择...
非线程安全(NTS)版本的`php_redis.dll`则适用于单线程或者不依赖线程安全特性的环境。由于没有额外的同步机制,它的执行速度通常会比线程安全版本更快。如果你的PHP运行环境是Apache(在Windows上通常使用FastCGI...
线程安全是指在多线程环境中,一个类或函数能够按照其规格说明正确执行,即使在各种线程调度或交错执行的情况下,也不会出现竞态条件、数据竞争、死锁或其他不一致的情况。构建线程安全的应用程序是并发编程中的一个...
线程安全的日志库在多线程环境下尤为重要,因为不正确的日志操作可能会导致数据竞争和同步问题。本文将详细讨论如何在C++中实现一个基于Win32接口的线程安全日志库,并关注其核心概念和技术。 首先,我们需要理解...
C#跨线程调用窗体控件时可能会引发线程安全问题,例如当多个线程操作同一个控件时,该控件可能会进入不一致的状态,出现争用情况和死锁等问题。因此,确保以线程安全方式访问控件非常重要。 在C#中,控件并不是线程...
Servlet和Struts Action是两种常见的Java Web开发组件,它们在多线程环境下运行时可能存在线程安全问题。线程安全是指在多线程环境中,一个类或者方法能够正确处理多个线程的并发访问,保证数据的一致性和完整性。 ...
在Java中,线程安全问题通常与并发、内存模型和可见性有关。Java内存模型(JMM)定义了如何在多线程环境下共享数据的规则,确保线程之间的正确交互。 线程安全可以分为三种类型: 1. 不安全:当多个线程访问共享...
首先,我们要理解什么是线程安全。线程安全是指当多个线程同时访问一个对象或方法时,代码仍然能够正确执行,不会出现数据混乱或者异常的情况。在C#中,实现线程安全通常有几种策略:锁(Lock)、Monitor、Mutex、...
在Java中,线程安全的集合主要分为三类:同步集合、并发集合和不可变集合。 1. 同步集合(Synchronized Collections): 这些是基于非线程安全的集合(如ArrayList、HashMap)通过`Collections.synchronized*`方法...
通过编写和执行这样的测试,开发者可以确保他们的代码在并发环境下能够正确地工作,避免潜在的数据不一致性和其他线程安全问题。同时,这也提醒我们在编程时要时刻注意变量的作用域和生命周期,以及它们与多线程环境...
首先,我们要理解什么是线程安全和非线程安全。线程安全指的是在多线程环境下,一个函数或方法在同一时刻可以被多个线程调用而不会导致数据的不一致或错误。这通常通过锁机制来实现,如互斥锁(mutex)或者读写锁...
然而,只有深入理解线程安全的概念,并且在设计和实现时谨慎处理共享资源和线程交互,才能编写出高效、稳定且安全的多线程程序。开发人员应当时刻铭记线程安全的重要性,并将其作为设计多线程程序时的首要考虑因素。