zoukankan      html  css  js  c++  java
  • java中的锁

    1.自旋锁是采用让当前线程不停地的在循环体内执行实现的,当循环的条件被其他线程改变时 才能进入临界区

    public class SpinLock {
    private AtomicReference<Thread> owner =new AtomicReference<>();
    public void lock(){
    Thread current = Thread.currentThread();
    while(!owner.compareAndSet(null, current)){
    }
    }
    public void unlock (){
    Thread current = Thread.currentThread();
    owner.compareAndSet(current, null);
    }
    }

    使用了CAS原子操作,lock函数将owner设置为当前线程,并且预测原来的值为空。unlock函数将owner设置为null,并且预测值为当前线程。

    当有第二个线程调用lock操作时由于owner值不为空,导致循环一直被执行,直至第一个线程调用unlock函数将owner设置为null,第二个线程才能进入临界区。

    由于自旋锁只是将当前线程不停地执行循环体,不进行线程状态的改变,所以响应速度更快。但当线程数不停增加时,性能下降明显,因为每个线程都需要执行,占用CPU时间。如果线程竞争不激烈,并且保持锁的时间段。适合使用自旋锁。

    2.可重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。
    在JAVA环境下 ReentrantLock 和synchronized 都是 可重入锁。

    public class Test implements Runnable{

     public synchronized void get(){
      System.out.println(Thread.currentThread().getId());
      set();
     }

     public synchronized void set(){
      System.out.println(Thread.currentThread().getId());
     }

     @Override
     public void run() {
      get();
     }
     public static void main(String[] args) {
      Test ss=new Test();
      new Thread(ss).start();
      new Thread(ss).start();
      new Thread(ss).start();
     }
    }

    ReentrantLock与synchronized的区别

    1.ReentrantLock使用起来比较灵活,但是必须有释放锁的动作;

    2.ReentrantLock必须手动释放和开启锁,synchronized 不需要;

    3.ReentrantLock只适用与代码块锁,而synchronized 对象之间的互斥关系;

       
  • 相关阅读:
    org.apache.commons.net.ftp
    java中的匿名内部类总结
    有关JVM处理Java数组方法的思考
    使用myeclipse创建带注解的model实体类
    Maven导出Project依赖的jar包
    annotation-config, annotation-driven, compont-scan 区别
    hibernate annotation注解方式来处理映射关系
    关于Spring事务<tx:annotation-driven/>的理解(Controller可以使用@Transactional)
    Hibernate批量操作(二)
    Hibernate批量操作(一)
  • 原文地址:https://www.cnblogs.com/dfyz/p/5738455.html
Copyright © 2011-2022 走看看