/* * 查看程序,到底是输出多少? * */ public class TT implements Runnable { int b=0; public synchronized void m1() { b=1000; try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } b = b+1; System.out.println("b="+b); } public void m2() { System.out.println("m2= "+b); } @Override public void run() { m1(); } public static void main(String[] args) { TT tt = new TT(); Thread t = new Thread(tt); t.start(); try { //睡眠的目的是为了让上面的线程做好充足准备防止主线程一开始就抢占cpu控制权,目的是为了实验准确性 Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } tt.m2(); } } /* * 输出为m2 = 1000,b = 1001; * 这说明在有锁的线程执行的时候,只是锁定当前对象,只是说确保其他线程不会在当前线程没有执行完毕的时候 * 再次执行锁定的方法里面的这段话。但是不影响它执行其他方法。锁定的只是那个锁定的方法不能同时被访问而已 *注意这里的1000,和1001. 1001是5秒后的继续执行后的值。1000是锁定的线程停顿之后(b的值已经修改了),其他方法获取道德b的值。 * 还有注意的是,不是锁定的程序m1执行完才能执行m2.如果那样就是输出1001,1001了 * */