Java多线程之Synchronized应用在static和非static方法上的区别

来源:互联网 发布:讨鬼传2最美捏脸数据 编辑:程序博客网 时间:2024/04/30 18:10

同步static方法:

public class Bank implements Runnable{static int money = 2700;//注意区别public static synchronized void Withdraw() {//public synchronized void Withdraw() {for(int i=0; i<3;i++){int temp = money;temp = temp-300;money = temp;System.out.println(Thread.currentThread().getName()+" "+money);}}public void run(){Withdraw();}public static void main(String[] args) throws InterruptedException {Bank b1 = new Bank();Bank b2 = new Bank();Bank b3 = new Bank();Thread t1 = new Thread(b1,"b1");Thread t2 = new Thread(b2,"b2");Thread t3 = new Thread(b3,"b3");t1.start();t2.start();t3.start();t1.join();t2.join();t3.join();System.out.println("The remaining money is "+money);}}
结果为:

b1 2400
b1 2100
b1 1800
b2 1500
b2 1200
b2 900
b3 600
b3 300
b3 0
The remaining money is 0


同步非static方法:

public class Bank implements Runnable{static int money = 2700;//注意区别//public static synchronized void Withdraw() {public synchronized void Withdraw() {for(int i=0; i<3;i++){int temp = money;temp = temp-300;money = temp;System.out.println(Thread.currentThread().getName()+" "+money);}}public void run(){Withdraw();}public static void main(String[] args) throws InterruptedException {Bank b1 = new Bank();Bank b2 = new Bank();Bank b3 = new Bank();Thread t1 = new Thread(b1,"b1");Thread t2 = new Thread(b2,"b2");Thread t3 = new Thread(b3,"b3");t1.start();t2.start();t3.start();t1.join();t2.join();t3.join();System.out.println("The remaining money is "+money);}}

结果为:

b2 2100
b3 2100
b1 2100
b3 1500
b2 1800
b3 900
b1 1200
b2 600
b1 300
The remaining money is 300

0 0
原创粉丝点击