zoukankan      html  css  js  c++  java
  • 同步与死锁

    以卖车票为例:

    class SyThread implements Runnable{
     private int ticket = 5;
     
     @Override
     public void run() {
      //for(int i=5; i>0; i--)
      for(int i=0; i <100; i++){
       if(ticket >0){
        try {
         Thread.sleep(500);
        } catch (InterruptedException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
        }
        System.out.println("卖出票数为:"+ticket--);
       }
      }
      }
     }
    }
     

    public class SynchronizedDemo01 {
     public static void main(String[] args) {
      SyThread st = new SyThread();
      Thread mt1 = new Thread(st);
      Thread mt2 = new Thread(st);
      Thread mt3 = new Thread(st);
      mt1.start();
      mt2.start();
      mt3.start();

     }

    卖出票数为:5
    卖出票数为:5
    卖出票数为:4
    卖出票数为:3
    卖出票数为:2
    卖出票数为:1
    卖出票数为:-1
    卖出票数为:0


    上述程序说明在资源共享的情况下如果不让各线程同步,会造成结果出现异常的情况;在这个卖票的系统中票数出现的负数的情况;

    需要注意的是:
     用Thread类的时候,如果要让线程休眠,那么需要加上捕获异常;
     对于同一个类,可以有多个线程进行同时使用,这就是多线程;

    class SyThread implements Runnable{
     private int ticket = 5;
     
     @Override
     public void run() {
      //for(int i=5; i>0; i--)
      for(int i=0; i <100; i++){
       synchronized(this){ //加上synchronized关键字的目的是让线程在使用资源的时候判断有没有其它的线程正在使用资源
       if(ticket >0){
        try {
         Thread.sleep(500);
        } catch (InterruptedException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
        }
        System.out.println("卖出票数为:"+ticket--);
       }
      }
      }
     }
    }
     

    public class SynchronizedDemo01 {
     public static void main(String[] args) {
      SyThread st = new SyThread();
      Thread mt1 = new Thread(st);
      Thread mt2 = new Thread(st);
      Thread mt3 = new Thread(st);
      mt1.start();
      mt2.start();
      mt3.start();

     }
    }
    运行结果:
    卖出票数为:5
    卖出票数为:4
    卖出票数为:3
    卖出票数为:2
    卖出票数为:1


    加上synchronized关键字的目的是让线程在使用资源的时候判断有没有其它的线程正在使用资源


    如果使用太多的线程同步,则可能会造成死锁
    死锁的意思就是说:
    甲想要乙的书,乙想要甲的画;
    甲对乙说:你给我你的书,我就把画给你;
    乙对甲说:你给我你的画,我就把书给你;
    结果双方都因为对方没有主动给你,而在那里等待着,这就是程序的死锁;


     

  • 相关阅读:
    通过Web启动本地应用程序
    类似百度文库文档预览方式实现
    cas4.0 session中返回更多的用户信息
    word转pdf图片问题
    JSON数据转换成table表格
    2017年各银行卡跨行取款收费标准
    解决win8/8.1系统安装.net framework 3.5出现0x800F0906代码错误
    更改Thunderbird的默认语言
    java获取客户端ip地址
    为jquery ajax请求增加正在运行提示
  • 原文地址:https://www.cnblogs.com/penggy/p/7475866.html
Copyright © 2011-2022 走看看