需要注意的就是,java的syn关键字最终是由native的物理锁实现的。
使用syn关键字,我认为效率低下的原因,不仅仅是其他线程需要等待,而且是因为
第一、需要底层调用。这应该就是concurrent包出现的原因。
第二、其他线程在等待的时候,需要挂起和唤醒,这个挂起和唤醒的动作只有操作系统才能做。也就是需要操作系统的帮忙,也就是说程序需要从用户态转换为核心态。这就无疑加重了应用的负担。
concurrent包中的Lock与synchronized不同之处主要体现在Lock比synchronized更灵活得多,而这些灵活又主要体现在如下的几个方法:
//lock()
tryLock()
tryLock(long timeout, TimeUnit timeUnit)
lockInterruptibly()
//unlock()
这些都是ReentrantLock的内容。
A、trylock()方法:如果获取了锁立即返回true,如果别的线程正持有锁,立即返回false;
B、tryLock(long timeout, TimeUnittimeUnit)方法:如果获取了锁定立即返回true,如果别的线程正持有锁,会等待参数给定的时间,在等待的过程中,如果获取了锁定,就返回true,如果等待超时,返回false;
是不是比synchronized灵活就体现出来了,打个不是很恰当的比分:你现在正在忙于工作,突然感觉内急,于是你跑向洗手间,到门口发现一个“清洁中,暂停使用”的牌牌。没办法,工作又忙,所以你只好先放弃去洗手间回去忙工作,可能如此反复,终于你发现可以进了,于是......像这样的场景用synchronized你怎么实现?没办法,如果synchronized,当你发现洗手间无法暂时无法进入时,就只能乖乖在门口干等了。
线程同步机制的jvm实现如下:
http://hi.baidu.com/quest2run/blog/item/7e9c8b8326052cd99023d955.html
实现自己的读写锁:
http://rttmmr.blog.163.com/blog/static/3160078120071045586576/
http://www.cnblogs.com/GnagWang/archive/2011/02/27/1966606.html