Java多线程---Lock类

       上一篇文件讲了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

          http://www.importnew.com/21866.html  synchronized的总结


发布了26 篇原创文章 · 获赞 5 · 访问量 2万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章