您的位置:首页 > 编程语言 > Java开发

java中线程安全提现在两个方面

2016-03-03 10:43 281 查看

java中线程安全提现在两个方面

在Java里,线程安全一般体现在两个方面:

  (1)多个thread对同一个java实例的访问(read和modify)不会相互干扰,它主要体现在关键字synchronized.如ArrayList和Vector,HashMap和Hashtable(后者每个方法前都有synchronized关键字)。如果你在Iterator遍历一个List对象时,同时其它线程remove一个element时,就会出现问题,数据丢失。(ArrayList是非线程安全的,而Vector是线程安全的;HashMap是非线程安全的,而Hashtable是线程安全的。)

  (2)每个线程都有自己的私有字段或变量,这样可以不会在多个线程之间共享。它主要体现在java.lang.ThreadLocal类,而没有Java关键字支持,如像static、transient那样。(一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable接口,这个对象的所有属性和方法都会自动序列化。 然而在实际开发过程中,某些类的有些属性需要序列化,而其他属性不需要被序列化时,则可以借助java的transient关键字。在需要序列化对象的时候,实现Serilizable接口,将类中不需要序列化的属性前添加关键字transient,那么带transient关键字的属性就不会序列化到指定的目的地中。)

java线程安全理解:

如果你的代码所在的进程中有多个线程同时运行,而这些线程可能会同时运行同一段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。

比如一个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。这就是“线程不安全”了。

如何做到线程安全:—-四种方式 sychronized关键字

1. sychronized method(){}

2. sychronized (objectReference) {/block/}

3. static synchronized method(){}

4. sychronized(classname.class)

其中1和2是代表锁当前对象,即一个对象就一个锁,3和4代表锁这个类,即这个类的锁。要注意的是sychronized method()不是锁这个函数,而是锁对象,即:如果这个类中有两个方法都是sychronized,那么只要有两个线程共享一个该类的reference(引用),每个调用这两个方法之一,不管是否同一个方法,都会用这个对象锁进行同步。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: