• 线程安全问题,死锁


    线程安全问题

     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     }
  • 相关阅读:
    java学习笔记(4)多态
    scala学习笔记(1)
    java复习(3)继承下
    java复习(3)继承
    java复习(2)
    java中常见的异常种类
    数组的内存结构
    Castle ActiveRecord学习(一)简介
    OAuth2.0 Owin 授权问题
    将对象转为json,加入到HttpResponseMessage中
  • 原文地址:https://www.cnblogs.com/bequt/p/5651839.html
Copyright © 2020-2023  润新知