在了解Java并发性的过程中有三点特性需要了解:原子性、有序性和可见性。原子性指的是一个操作不可中断的特性,一旦一个操作线程开始,就不应被其他线程所干扰;有序性是指按照代码的先后顺序来执行代码,重新排序不影响单线程程序执行,但会影响到并发性的正常;可见性是指当多个线程访问同一个变量时,其中一个线程的变量值若是被修改,其他线程也可看到,Java提供了volatile关键字确保可见性。
选择器对象的特点是线程安全,但其中包含的键集合并不是。通过keys( )和selectKeys( )返回的键的集合可以为Selector对象内部的Set对象集合的直接引用。这些集合可以在任意的时间进行改变。已注册键的集合是只读的。当你尝试改动它,他就会现实不支持。尚学堂陈老师指出,在观察它们的时候,它们可能发生了改变的话,您仍然会遇到麻烦。Iterator对象是快速失败的(fail-fast):如果底层的Set被改变了,它们将会抛出异常,因此如果您期望在多个线程间共享选择器和/或键,请对此做好准备。您可以直接修改选择键,但请注意您这么做时可能会彻底破坏另一个线程的Iterator。
Selector类的close( )方法和slect( )方法的同步方式相同,所以也可能会阻塞。在过程的选择中,所有对close( )的调用都可能阻塞,直到选择停止,或者执行选择的线程进入睡眠。在后续的过程中,线程的执行与选择将会在执行关闭的线程获得锁是立即被唤醒,进而将选在器关闭。
小编是一个有着5年工作经验的java程序员,对于java,自己有做资料的整合,一个完整学习java的路线,学习资料和工具,相信这里有很多学习java的小伙伴,我创立了一个2000人学习扣群,479121291。每晚都有java的直播课程。无论是初级还是进阶的小伙伴小编我都欢迎!
在学Java并发性的过程中还要注意两点:
一是如果在多线程中并发地访问一个选择器的键的集合的时候存在一些问题,可以采取一些步骤进行合理地同步访问。当执行选择操作时,选择器在Selector对象上进行同步,然后是已注册的键的集合,最后是已选择的键的集合,按照这样的顺序。已取消的键的集合也在选择过程的的第1步和第3步之间保持同步(当与已取消的键的集合相关的通道被注销时)。
二是在多线程的场景中,如果您需要对任何一个键的集合进行更改,不管是直接更改还是其他操作带来的副作用,您都需要首先以相同的顺序,在同一对象上进行同步。需要注意的是锁的过程。若是竞争的线程未能用相同的顺序请求锁,就将会有死锁的可能。如果可以保证其他线程不会同时访问选择器,则可以不用进行同步。
Java的并发性与多线程密切相关,也是Java语言中最重要的特性之一,在学的时候可结合实例来灵活掌握。