首先是synchronized 关键字

他可以用于声明方法,也可以用于申明代码块。我们看看三个例子:

public class SynchronizedDemo1 {

    public synchronized static void foo1() {

    }

    public synchronized static void foo2() {

    }
}
public class SynchronizedDemo2 {

    public synchronized void foo3() {

    }

    public synchronized void foo4() {

    }
}
public class SynchronizedDemo3 {

    public void foo5() {
synchronized (this) { } } public void foo6() {
synchronized (SynchronizedDemo3.class) { }
}
}

第一个例子中,在不同线程中,两个方法的调用是互斥的,不仅是他们之间,任何两个不同线程的调用也互斥。

第二个例子中,在多线程环境中,调用同一个对象的foo3,foo4是互斥的,与例子1不同的是,这是针对同一个对象的互斥方法。

第三个例子中,synchronized (this)与synchronized 的成员方法是互斥的,和第二个例子类似。synchronized (SynchronizedDemo3.class)与synchronized 的静态方法是互斥的,和第一个例子类似。

synchronized 用于修饰代码块会更加的灵活,因为后面的参数可以是任意对象,还可以缩小加锁的范围,不用在整个方法上加锁。

ReentrantLock

下面是Lock接口:

public interface Lock {

    void lock();

    void lockInterruptibly() throws InterruptedException;

    boolean tryLock();

    boolean tryLock(long time, TimeUnit unit) throws InterruptedException;

    void unlock();

    Condition newCondition();
}

ReentrantLock实现了Lock接口,并提供了与synchronized相同的呼哧性和内存可见性,在获取ReentrantLock有着与进入同步代码块相同的内存语义,在释放ReentrantLock时候,同样有着与退出同步代码块相同的意义。ReentrantLock支持在Lock接口中定义的所有获取锁的模式,并且与synchronized相比,它在处理锁不可用的时候,灵活性更好。下面是ReentrantLock的常见使用形式,必须在finally块中释放锁。

    Lock lock = new ReentrantLock();

    lock.lock();
try {
//更新对象状态
//捕获异常,并在必要时进行处理
}finally {
lock.unlock();
}

ReentrantLock相对于synchronized有更好的灵活性已经更多功能,比如:

1.lock.tryLock()可以返回是否获得锁,如果没有获得会立即返回false,如果获得则当前调用线程会获得锁,并理解返回true。

 2.构造ReentrantLock的时候可以传入一个boolean值,那就是描述锁是否公平。公平锁的好处是等待锁的线程不会饿死,但是整体效率要低一些;非公平锁的好处是整体效率相对高一些,但是有些线程可能会饿死,或者说很早就在等待但是要等很久才等到。原因是公平锁是严格按照请求锁的顺序来排队的,而非公平可以是抢占的,如果某个时刻有个线程需要获得锁,而这时候刚好锁可用,那么这个线程就直接抢占,而这时候阻塞在等待队列上的线程则不会被唤醒。

此外ReentrantLock也提供了ReentrantReadWriteLock,从名字上看就可以看出是读写锁,主要用于读多写少的情况。这样的场景使用读写锁会比全部使用互斥锁性能高很多。

ReentrantReadWriteLock用法与ReentrantLock类似,差异是ReentrantReadWriteLock是通过readLock()和writeLock()两个方法获得相关的读锁和写锁。

Java多线程之锁的更多相关文章

  1. JAVA多线程与锁机制

    JAVA多线程与锁机制 1 关于Synchronized和lock synchronized是Java的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码 ...

  2. Java 多线程:锁(一)

    Java 多线程:锁(一) 作者:Grey 原文地址: 博客园:Java 多线程:锁(一) CSDN:Java 多线程:锁(一) CAS 比较与交换的意思 举个例子,内存有个值是 3,如果用 Java ...

  3. Java 多线程:锁(二)

    Java 多线程:锁(二) 作者:Grey 原文地址: 博客园:Java 多线程:锁(二) CSDN:Java 多线程:锁(二) AtomicLong VS LongAddr VS Synchroni ...

  4. Java 多线程:锁(三)

    Java 多线程:锁(三) 作者:Grey 原文地址: 博客园:Java 多线程:锁(三) CSDN:Java 多线程:锁(三) StampedLock StampedLock其实是对读写锁的一种改进 ...

  5. java多线程----悲观锁与乐观锁

    java多线程中悲观锁与乐观锁思想 一.悲观锁 总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线 ...

  6. (转)java 多线程 对象锁&类锁

    转自:http://blog.csdn.net/u013142781/article/details/51697672 最近工作有用到一些多线程的东西,之前吧,有用到synchronized同步块,不 ...

  7. java多线程之锁 -- 偏向锁、轻量级锁、自旋锁、重量级锁

    转载至:https://blog.csdn.net/zqz_zqz/article/details/70233767 之前做过一个测试,详情见这篇文章<多线程 +1操作的几种实现方式,及效率对比 ...

  8. Java多线程--公平锁与非公平锁

    上一篇文章介绍了AQS的基本原理,它其实就是一个并发包的基础组件,用来实现各种锁,各种同步组件的.它包含了state变量.加锁线程.等待队列等并发中的核心组件,现在我们来看一下多线程获取锁的顺序问题. ...

  9. java多线程编程——锁优化

    并发环境下进行编程时,需要使用锁机制来同步多线程间的操作,保证共享资源的互斥访问.加锁会带来性能上的损坏,似乎是众所周知的事情.然而,加锁本身不会带来多少的性能消耗,性能主要是在线程的获取锁的过程.如 ...

  10. Java多线程之锁优化策略

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6561264.html  锁的优化策略 编码过程中可采取的锁优化的思路有以下几种: 1:减少锁持有时间 例如:对 ...

随机推荐

  1. 找回windows 8 中隐藏的Aero Lite主题

    在windows 8 预览版中,有一款主题Aero Lite,此主题已经不提供Aero glass的效果,还有反射模糊,但在windows 8 RTM中这个主题被隐藏了,我们在个性化里面看不到Aero ...

  2. USB DATA Toggle

    For bulk and interrupt transfers, the data toggle resets <0> only on Set Configuration, Set In ...

  3. Java学习笔记之深入理解引用

    引言:Java中数据传递的方式,除了基本数据类型是按照值传递,其它类型全部是按照引用传递,这和C++有很大区别,但是很多网上文章都解释的不清楚,甚至是错误的,在查阅资料之后,下面整理出一个比较容易理解 ...

  4. xiaoxia的vim配置

    这样已经很强大了 set nu sts=4 ts=4 sw=4 et si ai set ruler set hlsearch syntax on filetype plugin on

  5. 安装nodejs和grunt以后出现 /usr/bin/env: node: No such file or directory

    安装完成以后需要执行此命令 sudo ln -s /usr/bin/nodejs /usr/bin/node

  6. Codeforces Gym 100015G Guessing Game 差分约束

    Guessing Game 题目连接: http://codeforces.com/gym/100015/attachments Description Jaehyun has two lists o ...

  7. .net+mssql制作抽奖程序思路及源码

    近期一直在研究数据库,刚好有个项目要做抽奖程序,恩,拿来练练手吧. 抽奖程序: 思路整理,无非就是点一个按钮,然后一个图片旋转一会就出来个结果就行了,可这个程序的要求不是这样的,是需要从数据库中随机抽 ...

  8. android编程之ExpandableListView使用总结

    ExpandableListView这个类与其他android列表形式视图是比较类似的,看源码的话,可以知道它是多种视图组合而成.今天不分析源码,只写些使用心得.   1.Button 对,没错,就是 ...

  9. 【摘要】获得HTML元素的绝对位置

    function findAbsolutePosition(obj) { var curleft = curtop = 0; if (obj.offsetParent) { do { curleft ...

  10. Android Compatibility package 兼容性开发套件

    我们认为Android 3.0平板电脑操作系统在美国时间2011年2月22日的正式推出,对于Android手机应用程序开发者所象征的意涵是: 之前大家所开发过的Android手机应用,除了可以在And ...