Java多线程---Lock类

来源:互联网 发布:兰博基尼苹果壁纸软件 编辑:程序博客网 时间:2024/05/22 02:01

       上一篇文件讲了java多线程的基础知识,同步处理使用synchronized关键字。从Java5开始,引入了Lock类,改类在包java.util.concurrents.locks下面。使用该包下的类也可以进行并发编程。其中Lock和ReadWriteLock是两个最基本的接口,我们经常使用的是ReentrantLock类和ReentrantReadWriteLock类,它们分别是基类的实现类。

一.Lock类使用:

     它的使用其实就是将自己作为锁对象,使用之前会用lock()方法加锁,使用完用unlock()方法解锁。它们中间的代码是线程安全的。Lock类还有tryLock()方法判断调用的对象是否被锁住,它有返回值。它还支持锁的中断,阻塞线程可以跳出对已锁对象的调用。

例子:

    import java.util.concurrent.locks.ReentrantLock;      public class ZLock implements Runnable      {          private final ReentrantLock lock=new ReentrantLock();          public void run()          {              lock.lock();  //加锁              try              {                  for(int i=0;i<10;i++)                  System.out.println(Thread.currentThread().getName()+": "+i);              }              finally              {                  lock.unlock();  //释放锁,一般放在finally块中              }          }          public static void main(String[] args)          {              ZLock rl=new ZLock();              new Thread(rl,"子线程1").start();              new Thread(rl,"子线程2").start();          }      } 

结果:


二.Lock类特性

1.可重入性:

        synchronized和Lock都具有可重入性。可重入性,举个例子,一个类中,有两个被synchronized修饰的方法,其中一个方法调用另外一个方法,这是可以调用成功的。一个线程已经获得了该对象的锁,该对象调用自己的或者父类的方法(无论有无同步),都会成功。这就是可重入性(reentrant :可重入),一个线程可以对已经加锁的对象再次加锁。其他线程当然不能调用,因为其他线程根本就没有获得同步监视器(Lock锁)的锁定。

例子:

public class ReentrantLock {public synchronized void method1(){System.out.println(Thread.currentThread().getName()+"method---1");method2();    //调用method2()方法,该方法加锁了,可重入性表明还是可以调用成功              //线程内部有计数器,记录加锁的个数}public synchronized void method2(){System.out.println(Thread.currentThread().getName()+"method---2");}public static void main(String[] args){ReentrantLock rl=new ReentrantLock();rl.method1();  //调用method1()方法}}
结果:

2.支持公平锁

    公平锁使线程按照请求锁的顺序依次获得锁;而不公平锁则允许讨价还价,在这种情况下,线程有时可以比先请求锁的其他线程先得到锁。synchronized和默认的Lock都是不公平锁。Lock类的构造器可以设置为公平锁。

3.可重入读写锁(ReentrantReadWriteLock

这个类适合用在多读少写的情况,读锁是内存同步的但不互斥,多个线程可以共享一个对象;而写锁就是一般的锁,互斥同步。


三.选择synchronized还是Lock类

    synchronized是Java关键字,是原生属性,在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定,而Lock是一个类,它释放锁必须通过代码来实现unlock()。synchronized在Java6中性能有很大提升,可以这么说,性能与Lock不相上下。在一些特殊情况下必须要用Lock的特性来解决才会用Lock,或者线程竞争激烈的情况也会用Lock,这时的性能要高于synchronized。其他情况还是选择synchronized。

 

参考:

         《疯狂Java讲义》

         《大型网站系统与中间件实践》

          http://blog.csdn.net/haydenwang8287/article/details/5837734

          http://blog.csdn.net/ns_code/article/details/17487337

          http://www.cnblogs.com/dolphin0520/p/3923167.html


0 0
原创粉丝点击