多线程编程synchronized

使用取钱的demo来模拟实现线程的同步

  1 package com.iotec.synchronizedTest;
  2 
  3 import java.io.ObjectInputStream;
  4 
  5 public class BankDemo {
  6     public static void main(String[] args) {
  7         Bank bank = new Bank();
  8         BankThread p1 = new BankThread(bank);
  9         p1.start();     //柜台取钱
 10         BankThread p2 = new BankThread(bank);
 11         p2.start();     //ATM机上取钱
 12 
 13     }
 14 }
 15 
 16 class BankThread extends Thread{
 17     private Bank bank = null;
 18     public BankThread(Bank bank){
 19         this.bank = bank;
 20     }
 21 
 22     @Override
 23     public void run() {
 24         System.out.println(Thread.currentThread().getName()+"取钱:"+bank.getMoney(400));
 25     }
 26 }
 27 
 28 class Bank {
 29     //把竞争访问的资源标识为private
 30     private int money = 500;
 31 
 32     private Object object = new Object();
 33     //取钱的方法,返回取钱的数目
 34     //当一个线程去调用同步方法的时候,这个线程就获得当前对象的锁
 35     //其它线程当调用同步方法的时候只能等待,因为无法获取对象的锁
 36     //只有第一个线程释放对象的锁方可进入
 37 /*    public synchronized int getMoney(int number){
 38         if(number<0){
 39             return -1;
 40         }else if(money<0){
 41             return -2;
 42         }else if(number-money>0){
 43             return -3;
 44         }else {
 45             try {
 46                 Thread.sleep(1000); //模拟取钱的时间
 47             } catch (InterruptedException e) {
 48                 e.printStackTrace();
 49             }
 50             money -= number;
 51             System.out.println("余额:"+money);
 52         }
 53         return number;
 54     }*/
 55     public synchronized int getMoney(int number){
 56 //        synchronized (this){
 57         //可以持有的是任何对象
 58         synchronized (object){
 59             if(number<0){
 60                 return -1;
 61             }else if(money<0){
 62                 return -2;
 63             }else if(number-money>0){
 64                 return -3;
 65             }else {
 66                 try {
 67                     Thread.sleep(1000); //模拟取钱的时间
 68                 } catch (InterruptedException e) {
 69                     e.printStackTrace();
 70                 }
 71                 money -= number;
 72                 System.out.println("余额:"+money);
 73             }
 74             return number;
 75         }
 76 
 77     }
 78    /* public synchronized int getMoney(int number){
 79 
 80             if(number<0){
 81                 return -1;
 82             }else if(money<0){
 83                 return -2;
 84             }else if(number-money>0){
 85                 return -3;
 86             }else {
 87                 //放在这里是不对的,因为等第一个线程执行完,第二个线程对上面的逻辑并不会进行判断
 88                 //所以需要考虑清楚需要同步的是哪一个代码块
 89                 synchronized (this){
 90                     try {
 91                         Thread.sleep(1000); //模拟取钱的时间
 92                     } catch (InterruptedException e) {
 93                         e.printStackTrace();
 94                     }
 95                     money -= number;
 96                     System.out.println("余额:"+money);
 97                 }
 98             }
 99         return number;
100     }*/
101 
102 }
View Code

使用printChar来模拟线程的同步

Object obj = new Object();
        new Thread() {
            @Override
            public void run() {
                synchronized (obj) {
                    for (int i = 1; i <= 100; i++) {
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.println("B");
                        if (i % 4 == 0) {
                            try {
                                obj.wait();//释放锁
                                obj.notify();//唤醒打印AAAAA 的线程
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
        }.start();


        new Thread() {
            @Override
            public void run() {
                synchronized (obj) {
                    for (int i = 1; i <= 100; i++) {
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.println("AAAAA");
                        try {
                            obj.notify();//唤醒打印B的线程
                            obj.wait();//释放锁
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }.start();
View Code

使用另一个demo来模拟线程的死锁

 1 package com.iotec.synchronizedTest;
 2 
 3 public class DieThreadDemo {
 4     public static void main(String[] args) {
 5         Example example = new Example();
 6         DieThread1 dieThread1 = new DieThread1(example);
 7         dieThread1.start();
 8         DieThread2 dieThread2 = new DieThread2(example);
 9         dieThread2.start();
10 
11     }
12 
13 }
14 
15 class DieThread1 extends Thread{
16     private Example example = null;
17     public DieThread1(Example example){
18         this.example = example;
19     }
20 
21     @Override
22     public void run() {
23         example.method1();
24     }
25 }
26 class DieThread2 extends Thread{
27     private Example example = null;
28     public DieThread2(Example example){
29         this.example = example;
30     }
31 
32     @Override
33     public void run() {
34         example.method2();
35     }
36 }
37 
38 class Example{
39     private Object obj1 = new Object();
40     private Object obj2 = new Object();
41 
42     public void method1(){
43         synchronized (obj1){
44             try {
45                 Thread.sleep(1000);
46             } catch (InterruptedException e) {
47                 e.printStackTrace();
48             }
49             synchronized (obj2){
50                 System.out.println("method1");
51             }
52         }
53     }
54     public void method2(){
55         synchronized (obj2){
56             try {
57                 Thread.sleep(1000);
58             } catch (InterruptedException e) {
59                 e.printStackTrace();
60             }
61             synchronized (obj1){
62                 System.out.println("method2s");
63             }
64         }
65     }
66 
67 }
View Code
原文地址:https://www.cnblogs.com/zhf123/p/11372682.html