java根底数据结构之有条件线程安全ITeye - 牛牛娱乐

java根底数据结构之有条件线程安全ITeye

2019年02月23日14时03分08秒 | 作者: 雁蓉 | 标签: 线程,办法,目标 | 浏览: 897



履行成果我们也能够意料的到的
顺畅履行完结

java.lang.ArrayIndexOutOfBoundsException: Array index out of range: ***
 at java.util.Vector.get(Unknown Source)
 at VectorTest$ListOpt.run(VectorTest.java:44)
 at java.lang.Thread.run(Unknown Source)


或许有人这时候就要说,run 办法中的Vector每一个办法都是同步的,这不能作为线程不安全的根据
问题代码在于:
int listsize= list.size();
System.out.println(list.get(listsize-1));



  ‍  这一问题是由get()的前置条件是以size()的成果来界说的这一现实所带来的。只需看到这种有必要运用一种办法的成果作为另一种讲法的输入条件的款式,它就是一个状况依靠,就有必要确保至少在调用这两种办法期间元素的状况没有改动。一般来说,做到这一点的仅有办法在调用第一个办法之前是独占性地确定目标,一直到调用了后一种办法今后。在上面的迭代Vector元素的比如中,需求在迭代过程中同步Vector目标。
再回过头来看看
线程安全性  类要成为线程安全的,首要有必要在单线程环境中有正确的行为。假如一个类完成正确(这是说它契合标准阐明的另一种办法),那么没有一种对这个类的目标的操作序列(读或许写公共字段以及调用公共办法)能够让目标处于无效状况,观察到目标处于无效状况、或许违背类的任何不行变量、前置条件或许后置条件的状况。  此外,一个类要成为线程安全的,在被多个线程拜访时,不论运行时环境履行这些线程有什么样的时序组织或许交织,它有必要依然有如上所述的正确行为,而且在调用的代码中没有任何额定的同步。其作用就是,在所有线程看来,关于线程安全目标的操作是以固定的、大局共同的次序发作的。  正确性与线程安全性之间的联系十分类似于在描绘 ACID(原子性、共同性、独立性和持久性)业务时运用的共同性与独立性之间的联系:从特定线程的视点看,由不同线程所履行的目标操作是先后(尽管次序不定)而不是并行履行的。
上面比如中的办法之间的状况依靠联系好像破坏了整个类的共同性和独立性。

不行变  不行变的目标一定是线程安全的,而且永久也不需求额定的同步。由于一个不行变的目标只需构建正确,其外部可见状况永久也不会改动,永久也不会看到它处于不共同的状况。Java 类库中大大都根本数值类如 Integer 、 String 和 BigInteger 都是不行变的。 
线程安全  由类的标准阐明所规则的束缚在目标被多个线程拜访时依然有用,不论运行时环境怎么摆放,线程都不需求任何额定的同步。这种线程安全性确保是很严厉的 许多类,如 Hashtable 或许 Vector 都不能满意这种严厉的界说。


所以。。。
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表牛牛娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章