標籤:
package com.example;public class App { public static void main(String[] args) { doRunable dr = new doRunable(); Thread t1 = new Thread(dr,"Thread1"); Thread t2 = new Thread(dr,"Thread2"); t1.start(); t2.start(); }}
package com.example;public class doRunable implements Runnable { private Foo foo = new Foo(); @Override public void run() { for (int i = 0; i < 4; i++) { this.foo.modify(10); try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() +"__"+ this.foo.getNum()); } } public int getNum(){ return this.foo.getNum(); }}
package com.example;public class Foo { private int num = 100; public int getNum() { return this.num; } public int modify(int n) { /*Java語言中,每個對象都擁有一個存取碼關鍵區段並防止其他對象訪問這段代碼的monitor (每個對象都擁有一個對代碼關鍵區段提供訪問互斥功能的monitor)。這段關鍵區段是使用 synchronized對方法或者代碼標註實現的。同一時間在同一個monitor中,只允許一個線程 運行代碼的任意關鍵區段。*/ synchronized (this) { System.out.println("in" + this.num + " " + n); int m = this.num; this.num = m - n; System.out.println("out" + this.num + " " + n); } return this.num; }}
java 多線程(synchronized)