`
edr_
  • 浏览: 166206 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

简述synchronized和java.util.concurrent.locks.Lock的异同

    博客分类:
  • J2SE
阅读更多
简述synchronized和java.util.concurrent.locks.Lock的异同
源码来自一篇Java基础题

主要相同点:Lock能完成synchronized所实现的所有功能
主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放(因为如果不在finally中释放的情况,当抛出异常时,线程直接死掉,但是没有释放锁,使得其他相关线程无法执行。读者可以试试在定义一个数组,并访问越界区,使得程序抛出异常,但是释放锁并未在finally中)。
源码例子:
package test.thread;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class TestLock {
	private int j;
	private Lock lock = new ReentrantLock();
	public static void main(String[] args) {
		TestLock tt = new TestLock();
		for (int i = 0; i < 2; i++) {
			new Thread(tt.new Adder()).start();
			new Thread(tt.new Subtractor()).start();
		}
	}
	private class Subtractor implements Runnable {
		@Override
		public void run() {
			for (int i = 0; i < 15; i++) {
				// 这里抛异常了,锁能释放吗?会释放,但是lock就不会释放,所以需要加上try..catch
				/*synchronized (TestLock.this) { 
					System.out.println("j--=" +j--);
				}*/
				lock.lock();
				try {
					System.out.println("j--=" + j--);
				} finally {
					lock.unlock();
				}
			}
		}
	}
	private class Adder implements Runnable {
		@Override
		public void run() {
			for (int i = 0; i < 15; i++) {
				 /*synchronized (TestLock.this) {
					 System.out.println("j++="+j++); 
				 }*/
				lock.lock();
				try {
					System.out.println("j++=" + j++);
				} finally {
					lock.unlock();
				}
			}
		}
	}
}


Lock还有更强大的功能,例如,它的tryLock方法可以非阻塞方式去拿锁。

tryLock()
tryLock(long timeout, TimeUnit timeUnit)

trylock()方法:如果获取了锁立即返回true,如果别的线程正持有锁,立即返回false;

tryLock(long timeout, TimeUnit timeUnit)方法:如果获取了锁定立即返回true,如果别的线程正持有锁,会等待参数给定的时间,在等待的过程中,如果获取了锁定,就返回true,如果等待超时,返回false;
是不是比synchronized灵活就体现出来了,比如:你现在正在忙于工作,突然感觉内急,于是你跑向洗手间,到门口发现一个“清洁中,暂停使用”的牌牌。没办法,工作又忙,所以你只好先放弃去洗手间回去忙工作,可能如此反复,终于你发现可以进了,于是......
如果用synchronized,当你发现洗手间无法暂时无法进入时,就只能乖乖在门口干等了。
而使用trylock()呢,首先你试着去洗手间,发现暂时无法进入(trylock返回false),于是你继续忙你的工作,如此反复,直到可以进入洗手间为止(trylock返回true)。甚至,你非常急,你可以尝试性的在门口等20秒,不行再去忙工作(trylock(20, TimeUnit.SECONDS);)。
分享到:
评论

相关推荐

    深入Synchronized和java.util.concurrent.locks.Lock的区别详解

    本篇文章是对Synchronized和java.util.concurrent.locks.Lock的区别进行了详细的分析介绍,需要的朋友参考下

    多线程,高并发.pdf

    1. stop() 和 suspend() 方法为何不推荐使用? 2. sleep() 和 wait() 有什么区别? 3. 同步和异步有何异同,...5. 简述 synchronized 和 java.util.concurrent.locks.Lock 的异同? 6. 概括的解释下线程的几种可用状态。

    华为IBM的java面试题

    33.简述synchronized和java.util.concurrent.locks.Lock的异同 ? 34.EJB规范规定EJB中禁止的操作有哪些? 35.java除了8种基本类型外,在虚拟机里还有哪一种,有什么作用? 36.除了使用new关键字创建对象意外,试列举...

    125道经典JAVA面试题

    面向对象的特征有哪些方面?运行时异常与一般异常有何异同?简述synchronized和java.util.concurrent.locks.Lock的异同?等等面试题。。。。。

    Java 面试宝典

    1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? ...... 7 2、Java 有没有 goto? .......................................................................................................

    Java学习题答案

    简述synchronized和java.util.concurrent.locks.Lock的异同 ?(15分) 6.EJB规范规定EJB中禁止的操作有哪些?(15分) 最后还有一题考考你的眼力: public String toString(){ return this + "@" + this....

    java面试宝典2012版.pdf

    54、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 56、子线程循环10次,接着主线程循环100,接着又回到子线程...

    java面试题

    14. 简述synchronized和java.util.concurrent.locks.Lock的异同 ? 11 15. 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 11 16. abstract class和interface有什么区别? 12...

    java基础题 很全面

    50. 简述synchronized和java.util.concurrent.locks.Lock的异同 ? 13 51. 排序都有哪几种方法?请列举。用JAVA实现一个快速排序。 13 52. JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表...

    JAVA面试题最全集

    简述synchronized和java.util.concurrent.locks.Lock的异同 ? 34.EJB规范规定EJB中禁止的操作有哪些? 35.java除了8种基本类型外,在虚拟机里还有哪一种,有什么作用? 36.除了使用new关键字创建对象意外,试列举...

    java面试宝典

    77、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 18 78、abstract class Name { private String name; public abstract boolean isStupidName(String name) {}}这有何错误? 18 79、public class ...

    Java面试宝典-经典

    54、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 34 55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到...

    java面试题大全(2012版)

    54、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 34 55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到...

    最新Java面试宝典pdf版

    54、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 34 55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到...

    Java面试笔试资料大全

    54、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 34 55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到...

    java 面试题 总结

    JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变...

Global site tag (gtag.js) - Google Analytics