楼子湾

导航

 

一.流程控制

Java 中流程控制方式采用结构化程序设计中规定的三种基本流程结构:   

顺序结构

分支结构

循环结构

 

  1、顺序结构

    程序从上到下逐行地执行,中间没有任何判断和跳转。

  2、分支结构

    根据条件,选择性地执行某段代码;

    有 if...else 和 switch-case 两种分支语句;

  3、循环结构

    根据循环条件,重复性的执行某段代码。

    有 while、do...while、for 三种循环语句。

    注意:JDK1.5 提供了 foreach 循环,方便的遍历集合、数组元素。

二.先行发生原则(happens before)

1.程序次序原则(Program Order Rule):

在一个线程内,按照控制流顺序,书写在前面的操作先行发生于书写在后面的操作。注意,这里说的是控制流顺序而不是程序代码顺序,因为要考虑到分支、循环等结构。

2.管成锁定规则(Monitor Lock Rule)

一个unlock操作先行发生于后面对同一个锁的lock操作。这里必须强调的是“同一个锁”,而“后面”指的是时间上的先后顺序。

3.volatile变量规则(Volatile Variale Rule)

对于一个volatile变量的写操作先行发生于这个变量的读操作,这里的“后面”同样是指时间上的先后。

4.线程启动规则(Thread Start Rule)

Thread对象是start()方法先行发生于此线程的每一个动作。

5.线程终止规则(Thread Termination Rule)

线程中的所有操作都先行发生于对此线程的中止检测,我们可以通过Thread::join()方法是否结束、Thread::isAlive()的返回值等手段检测线程是否已经终止执行

例子:设两个线程s、t。在线程s中调用t.join()方法。则线程s会被挂起,等待t线程运行结束才能恢复执行。当t.join()成功返回时,s线程就知道t线程已经结束了。所以根据本条原则,在t线程中对共享变量的修改,对s线程都是可见的。类似的还有Thread.isAlive方法也可以检测到一个线程是否结束。
可以猜测,当一个线程结束时,会把自己所有操作的结果都同步到主内存。而任何其它线程当发现这个线程已经执行结束了,就会从主内存中重新刷新最新的变量值。所以结束的线程A对共享变量的修改,对于其它检测了A线程是否结束的线程是可见的。

6.线程中断规则(Thread Interruuption Rule)

对线程的interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生,可以通过Thread::interrupt()检测到是否有中断发生

7.对象终结规则(Finalizer Rule)

一个对象的初始化完成(构造函数执行结束)先行发生于它的finalize()方法的开始。

8.传递性(Transitivity)

如果操作A先行发生于操作B,操作B先行发生于操作C,那么就可以得出操作A先行发生于操作C的结论。该规则是建立在前面7条规则基础上,满足任意一条即可使用

posted on 2021-02-16 14:40  楼子湾  阅读(798)  评论(0编辑  收藏  举报