For investors
股价:
5.36 美元 %For investors
股价:
5.36 美元 %认真做教育 专心促就业
Java编程开发语言随着互联网的不断发展而被越来越多的程序员掌握,今天我们就通过案例分析来简单了解一下,Java中的线程安全都有哪些类型。
Java线程安全:狭义地认为是多线程之间共享数据的访问。
Java语言中各种操作共享的数据有5种类型:不可变、绝对线程安全、相对线程安全、线程兼容、线程独立
①不可变
不可变(Immutable)的对象一定是线程安全的,不需要再采取任何的线程安全保障措施。
只要能正确构建一个不可变对象,该对象永远不会在多个线程之间出现不一致的状态。
多线程环境下,应当尽量使对象成为不可变,来满足线程安全。
如何实现不可变?
如果共享数据是基本数据类型,使用final关键字对其进行修饰,就可以保证它是不可变的。
如果共享数据是一个对象,要保证对象的行为不会对其状态产生任何影响。
String是不可变的,对其进行substring()、replace()、concat()等操作,返回的是新的String对象,原始的String对象的值不受影响。而如果对StringBuffer或者StringBuilder对象进行substring()、replace()、append()等操作,直接对原对象的值进行改变。
要构建不可变对象,需要将内部状态变量定义为final类型。如java.lang.Integer类中将value定义为final类型。
②绝对线程安全
绝对线程安全的实现,通常需要付出很大的、甚至不切实际的代价。
JavaAPI中提供的线程安全,大多数都不是绝对线程安全。
例如,对于数组集合Vector的操作,如get()、add()、remove()都是有synchronized关键字修饰。有时调用时也需要手动添加同步手段,保证多线程的安全。
③相对线程安全
相对线程安全需要保证对该对象的单个操作是线程安全的,在必要的时候可以使用同步措施实现线程安全。
大部分的线程安全类都属于相对线程安全,如Java容器中的Vector、HashTable、通过Collections.synchronizedXXX()方法包装的集合。
④线程兼容
Java中大部分的类都是线程兼容的,通过添加同步措施,可以保证在多线程环境中安全使用这些类的对象。
如常见的ArrayList、HashTableMap都是线程兼容的。
⑤线程对立
线程对立是指:无法通过添加同步措施,实现多线程中的安全使用。
线程对立的常见操作有:Thread类的suspend()和resume()(已经被JDK声明废除),System.setIn()和System.setOut()等。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei456学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。