• 多线程编程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
  • 相关阅读:
    搜索引擎代码资源
    shell十三问(很不错的shell解释)
    Export/Import 使用技巧与常见错误
    利用java实现数据结构中常用的插入排序和快速排序算法
    java23种设计模式与追MM
    sqlldr使用小结(zt)
    排序算法的java实现的网址链接
    Rdesktop与Window相联
    java抽取word,pdf的四种武器
    常用数据库JDBC连接写法
  • 原文地址:https://www.cnblogs.com/zhf123/p/11372682.html
Copyright © 2020-2023  润新知