package com.homework; //同步代碼塊的鎖爲任意鎖,而同步方法的鎖爲this,如何證實同步方法的鎖爲this. /* * 思路:建立2個線程,須要對同一資源進行操做。一個線程進入同步代碼塊,另一個線程進入同步方法。 * 將同步代碼塊的鎖定義爲this,若是這樣操做能保證數據的安全問題。說明這2個線程用的是同一把鎖。 * 用同步來保證操做同一資源的多條語句在同一時刻只能被一個線程使用。 線程要執行同步裏的語句,必須知足2個條件:1:得到cpu的執行權,2:得到同步鎖。 * */ public class MyRunnable2 implements Runnable{ public int sum = 0; public boolean flag = true; public Object obj = new Object(); @Override public void run() { if (flag) {//先讓一個線程進入到if. //flag = false;也能夠在這裏改變flag跟在測試類那裏改變同樣的效果 //睡眠 try { Thread.sleep(15); } catch (InterruptedException e) { e.printStackTrace(); } for (int i = 0; i < 3; i++) { synchronized (this) { sum = sum + 100; System.out.println(Thread.currentThread().getName() + "存了100元,現有" + sum); } } }else{// 改變flag的值。 for(int i=0;i<3;i++){ setSum(); } } } public synchronized void setSum() {//同步方法的鎖爲this. sum = sum + 100; try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out .println(Thread.currentThread().getName() + "存了100元,現有" + sum+":同步方法"); } } 測試: public class TestMyRunnable2 { public static void main(String[] args) { MyRunnable2 runnable = new MyRunnable2(); Thread t1 = new Thread(runnable); Thread t2 = new Thread(runnable); t1.start(); //讓主線程睡眠一下。 try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } //改變flag的值。 runnable.flag = false; t2.start(); } }