什么是线程安全和线程不安全

首先要明白线程的工作原理,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的过程,才会释放它得到的锁。这样就实现了所谓的线程安全。

------------------------------------------------------

什么是线程安全?线程安全是怎么完成的(原理)?

线程安全就是说多线程访问同一代码,不会产生不确定的结果。编写线程安全的代码是低依靠线程同步。

------------------------------------------------------

在接口方式中,线程有一个共享的数据成员,即:

privateintcount=10;

而在继承方式中,线程之间没有共享的成员,而是各线程各自有一个私有成员,即:

privateintcount=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。这就是“线程不安全”了。

http://www.pdzclub.com/thread-553-1-1.html

相关推荐