zoukankan      html  css  js  c++  java
  • 线程同步

    线程同步

    同步代码块

    synchronized(监视器){

    //共同享用的代码块

    }

    多个线程在抢夺cpu执行权,在执行run()方法,遇到synchronized代码块时,会检查是否有锁对象,如果有,就继续执行下去。反则,该线程就会进入阻塞状态。直到锁对象被释放,多个线程就会继续抢夺cpu执行权。

    Object obj = new Object();//监视器

    public void run() {

               while(true){
                   synchronized (obj){
                       if(tickets>0) {
                           System.out.println(Thread.currentThread().getName() + "-->" +"正在出售第"+tickets+"票");
                           tickets--;
                      }
                  }

              }

      }

    同步方法

    1.把共同访问的数据总结抽取出来,放进一个方法里面。

    2.格式是 :修饰符 synchronized 返回值类型 方法名(参数列表){

    //共享的数据;

    }

    public void run() {

           while(true){
               sell();
          }

      }

       public synchronized  void sell(){
           synchronized (obj){
               if(tickets>0) {
                   System.out.println(Thread.currentThread().getName() + "-->" +"正在出售第"+tickets+"票");
                   tickets--;
              }
          }
      }

    使用lock锁

    步骤:

    1.在成员位置创建一个ReentrantLock对象

    2.在可能出现线程安全代码前调用:ReentrantLock的lock()方法。

    注:将可能出现线程安全代码放进try{}中

    3.在finally{}中调用unlock()

         Lock r =  new ReentrantLock();//1.在成员位置创建一个ReentrantLock对象
       @Override
       public void run() {

           while(true){
              r.lock();
              try{
                  if(tickets>0) {
                      System.out.println(Thread.currentThread().getName() + "-->" +"正在出售第"+tickets+"票");
                      tickets--;
                      }
                }
              finally {
                  r.unlock();
                  }

          }

     

  • 相关阅读:
    oracle timestamp的转换
    sql总结
    shell命令记录一些
    练手之 合并排序
    jquery的笔记
    jquery的几个小例子
    【转】JQUERY相关的几个网站
    hibernate spring sturts2配置
    oracle积累继续
    2018.8.21 2018暑假集训之方格取数
  • 原文地址:https://www.cnblogs.com/stydejava/p/13436748.html
Copyright © 2011-2022 走看看