• 线程安全问题,死锁


    线程安全问题

     1     /*
     2      * 线程安全问题
     3      *             利用到static的共享情况
     4      * 
     5      * 
     6      * 1.存在两个或者两个以上的线程    
     7      * 2.线程共同争夺共享资源
     8      * 3.存在多个语句操作共享资源
     9      * 
    10      *        解决方案:
    11      *                线程同步机制:
    12      *                    方式一:同步代码块   推荐使用
    13      *                            synchronized(锁对象){
    14      *                                 需要同步的代码
    15      *                            }
    16      *                        //--1.任意一个对象都可以作为锁对象,锁对象必须是唯一共享的!
    17      *                        //--2.只有真正存在线程问题的时候才使用代码块,否则会降低效率,,,利用上面的可能出现线程安全来判断
    18      *                        //--3.这个任意对象必须是静态的,因为这样才能为同一个对象.没有static就是三个对象了!
    19      *                        //--4.也可以使用"锁" 这种字符串来作为锁,这是最简单的锁,因为这个是在静态池中的!
    20      *
    21      *                    
    22      *                
    23      *                   方式二:同步函数:
    24      *                            使用synchronized修饰的函数
    25      *                                 直接  public synchronized void run()  这样使用
    26      *                        同步函数要注意的事项:
    27      *                                1.如果是一个非静态的同步函数,锁对象是this对象;如果是静态的同步函数,锁对象是当前的class对象,即共享对象
    28      *                                2.锁对象是固定的
    29      *    
    30      */
    31 
    32     static int num = 50; // 一共五十张票,要利用静态static! 若是非静态的话,是每个对象有一份这样的票数!
    33 
    34     static Object o = new Object();
    35     public Demo6(String name){
    36         super(name);
    37     }
    38     
    39     @Override
    40     public void run() {
    41         while (true) {
    42             synchronized (o) {
    43                 if (num > 0) {
    44                     System.out.println(Thread.currentThread().getName()+"卖出的票为" + num + "号");
    45                     num--;
    46                 } else {
    47                     System.out.println("票已经卖完......");
    48                     break;
    49                 }
    50             }
    51         }
    52     }
    53 
    54     public static void main(String[] args) {
    55         //三个窗口卖票
    56         Demo6 ck1 = new Demo6("窗口一");
    57         Demo6 ck2 = new Demo6("窗口二");
    58         Demo6 ck3 = new Demo6("窗口三");
    59         
    60         //开启售票多线程
    61         ck1.start();
    62         ck2.start();
    63         ck3.start();
    64     }

    死锁现象

     1     
     2     /*
     3          死锁:
     4              例子   张三有遥控器  没电池  ; 李四有电池  没遥控器,两人要去开空调
     5              
     6          原因: 
     7              1.存在两个或两个以上的线程
     8              2.存在两个或者两个以上的共享资源
     9          
    10          无解决方案,只能尽量避免存在!
    11      */
    12     
    13     public Demo7(String name){
    14         super(name);
    15     }
    16     
    17     @Override
    18     public void run() {
    19         if ("张三".equals(Thread.currentThread().getName())) {
    20             synchronized ("遥控器") {
    21                 System.out.println("张三得到遥控器,准备去拿电池");
    22                 synchronized ("电池") {
    23                     System.out.println("张三得到遥控器和电池,开了空调");
    24                 }
    25             }
    26         }else if("李四".equals(Thread.currentThread().getName())){
    27             synchronized ("电池") {
    28                 System.out.println("李四有电池,准备去拿遥控器");
    29                 synchronized ("遥控器") {
    30                     System.out.println("李四得到遥控器和电池,开了空调");
    31                 }
    32             }
    33         }
    34         
    35     }
    36     
    37     public static void main(String[] args) {
    38             Demo7 d1 = new Demo7("张三");
    39             Demo7 d2 = new Demo7("李四");
    40             d1.start();
    41             d2.start();
    42     }
  • 相关阅读:
    cmanformat
    mysql-sql语言参考
    jQuery 判断多个 input checkbox 中至少有一个勾选
    Java实现 蓝桥杯 算法提高 计算行列式
    Java实现 蓝桥杯 数独游戏
    Java实现 蓝桥杯 数独游戏
    Java实现 蓝桥杯 数独游戏
    Java实现 蓝桥杯 算法提高 成绩排序2
    Java实现 蓝桥杯 算法提高 成绩排序2
    Java实现 蓝桥杯 算法提高 成绩排序2
  • 原文地址:https://www.cnblogs.com/bequt/p/5651839.html
Copyright © 2020-2023  润新知