我的理解synchronized就是将线程可能扰乱的程序块包裹起来,使synchronized块中的程序不至于被分开执行,而是作为一个元操作。
看段示例:
public class Synch implements Runnable { public static void main(String args[]) { Synch mt = new Synch(); Thread t1 = new Thread(mt, "t1"); Thread t2 = new Thread(mt, "t2"); Thread t3 = new Thread(mt, "t3"); Thread t4 = new Thread(mt, "t4"); Thread t5 = new Thread(mt, "t5"); Thread t6 = new Thread(mt, "t6"); Thread t7 = new Thread(mt, "t7"); Thread t8 = new Thread(mt, "t8"); Thread t9 = new Thread(mt, "t9"); Thread t0 = new Thread(mt, "t0"); t1.start(); t2.start(); t3.start(); t4.start(); t5.start(); t6.start(); t7.start(); t8.start(); t9.start(); t0.start(); } public void run() { synchronized (this) { System.out.println("_____"); System.out.println("F: " + Thread.currentThread().getName()); System.out.println("A: " + Thread.currentThread().getName()); } } }
运行结果(某次,不确定):
_____ F: t1 A: t1 _____ F: t3 A: t3 _____ F: t5 A: t5 _____ F: t2 A: t2 _____ F: t7 A: t7 _____ F: t4 A: t4 _____ F: t6 A: t6 _____ F: t8 A: t8 _____ F: t9 A: t9 _____ F: t0 A: t0
虽然数字基本无序,但是F:A:输出有序
将synchronized段注释掉,再看输出结果:
_____ F: t1 A: t1 _____ F: t3 _____ F: t2 A: t2 A: t3 _____ F: t9 A: t9 _____ F: t4 A: t4 _____ _____ _____ F: t6 A: t6 _____ F: t7 F: t8 A: t8 A: t7 F: t5 _____ F: t0 A: t0 A: t5
输出可以说是乱七八糟,线程的运行顺序完全没法控制。