一.流程控制
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条规则基础上,满足任意一条即可使用