zoukankan      html  css  js  c++  java
  • Java 多线程加锁

    以前的同步操作 基本上都是用到 synchronized 关键字,类似代码如下:

    synchronized(obj){

    //dosomething...

    }来做到同步,

    在 JDK5.0 里面有这么一个对象,ReentrantLock,发觉她的加锁编程的方式非常的适合日常的加锁习惯,

    EG:

    package com.thread.synchronise;

    import java.util.concurrent.locks.ReentrantLock;

    public class SynchroTest extends Thread{
    private int count = 0;
    private final ReentrantLock lock = new ReentrantLock();

    public void run()
    {

    //这里加了几次锁,在后面就的要相应的解锁 几次
          lock.lock(); // block until condition holds
          try {    
         count++;
         System.out.println(" count = "+count);
         try {
         Thread.sleep(3000);
        } catch (InterruptedException e) {
         e.printStackTrace();
        }
         System.out.println(" count = "+count);
          } finally {
         lock.unlock();
          }
    }
    /**
    * @param args
    */
    public static void main(String[] args) {
       // TODO Auto-generated method stub
       SynchroTest st1 = new SynchroTest();
    //   SynchroTest st2 = new SynchroTest();
    //   SynchroTest st3 = new SynchroTest();
      

    //这里不能够调用    new Thread(st1).run();方法,否则就不是多线程的了
       new Thread(st1).start();
       new Thread(st1).start();
       new Thread(st1).start();
    }

    }

    如果该线程等待某暂时获取不到的资源,那么我们可以用Condition Object来避免死锁情况。
    sufficientFunds = lock .newCondition();
    如果条件不满足:
    sufficientFunds.await();
    这时线程就会释放锁并进入blocked状态,其他线程就有机会执行操作。当其他线程执行完后,就可通知等待的线程继续执行它的操作了:
    sufficientFunds.signalAll();
  • 相关阅读:
    Java基础知识:正则表达式
    NodeJs 中 将表单数据转发到后台
    单片机的远程升级
    一些开源协议
    物联网的一些例子
    python一些开源特色库
    qt练习
    网页编程学习笔记
    PCB相关
    工业控制系统
  • 原文地址:https://www.cnblogs.com/danghuijian/p/4400704.html
Copyright © 2011-2022 走看看