`
Tonyguxu
  • 浏览: 279618 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【Java并发】锁

 
阅读更多

简介

 

 

        锁是控制多个线程对共享资源访问(读/写,读:读内容;写:修改内容+删除文件)的工具。通常,锁提供了对共享资源的独占访问:对共享资源的任何访问都需要首先获取锁,一次只能有一个线程获取锁。

 

       锁不仅是关于同步和互斥 的,也是关于内存可见 的。为了保证所有线程都能够看到共享的/可变变量的最新值,读取和写入线程必须使用公共的锁进行同步。

 

     针对有读/写两种不同访问方式,能不能做的更智能一些,有没有锁机制能允许对共享资源并发“读”访问,利用 ReadWriteLock 的读锁可以!!。

 

JDK 1.5 之前,协调共享对象 的访问(coordinate access to shared data )能采取的机制是synchronized volatile 。在1.5 后,通过显式定义同步锁对象(Lock对象)来实现同步,增加了ReentrantLock 。这样,大致可将锁分为implicit lock(内部锁)explicit lock(显示锁)。

 

 

一些概念

同步和互斥

当多个线程对共享资源访问的时候,很有可能会带来线程安全问题,可以通过同步监视器(synchronized同步块or同步方法)。

 

独占锁,互斥锁

 

死锁

两个线程互相等待对方释放同步监视器时就会发生死锁。一旦出现死锁,整个程序既不会发生任何异常,也不会给出任何提示,所有线程处于阻塞状态。

 

用锁来保护状态

一个错误观念:只有在写入共享变量时才需要同步。



构造线程安全类一种常见的锁规则:

在对象内部封装可变状态,通过对象的内部锁 来同步任何对这些可变状态访问的代码路径,从而保证在并发访问中的安全。


Synchronized


同步方法和同步代码块的粒度:

同步方法可能会带来活跃度与性能的问题,通过缩小synchronized块的范围我们既可以维护线程安全性,还能比较容易地提升并发性。但也不能让synchronized太小:不可以将一个原子操作分解到多个synchronized块中。不过应该尽量从synchronized块中分离耗时的且不影响共享状态的操作(参考并发编程实践p30) 。对于独享地操作本地(基于栈)变量,这些变量不被多线程共享,可以不放在同步块当中。

重进入(Reentrancy)

内部锁是可以重进入的,即线程在试图获取它自己占有的锁时,请求会成功。重进入的实现是通过为每个锁关联一个请求计数和一个占有它的线程。

 

 

何时释放同步监视器的锁定?

 

 

Lock接口

 

 

Lock lock = new ..;
...
lock.lock();
try{
//需要锁保护的更新对象的状态
}finally{
lock.unlock();
}

 finally千万不能丢!!

 

Lock接口实现类有:    ReentrantLock, ReentrantReadWriteLock.ReadLock, ReentrantReadWriteLock.WriteLock。

其中ReentrantLock实现了标准的互斥锁。

 

ReentrantLock

 

可重入

线程可以对它已经加锁的ReentrantLock锁再次加锁。所以一段被锁保护的代码可以调用另一个被相同锁保护的代码。

 

synchronized ReentrantLock 间选择

使用 ReentrantLock 时有些要额外注意的地方,比如在 finally 里调用 unlock()

ReentrantLock 可伸缩性( scalability )更好。--如何理解??

对于如何选择可以遵循这样的原则:在内部锁不能满足需求时,再考虑使用 ReentrantLock (内部锁能处理哪些问题??)当需要一些高级特性 时, ReentrantLock 才应该被使用:可定时的( timed )、可轮询的( polled )、可中断的( interruptible )锁获取操作,公平队列,非块结构锁( none-block-structured )。

 

Volatile

读一个 volatile 变量时,总能返回由某一线程写的最新值。 Volatile 的一个典型应用是:检查状态标记(完成、中断、其他状态)

访问volatile变量的操作不会加锁,也就不会引起执行线程的阻塞,volatile相对synchronized而言可以说是轻量级的同步机制。

Volatile 只能保证变量的“可见性 ”,却不能保证“原子性”。(相比较:加锁既能保证可见性也能保证原子性)。

示例

// 判断是否睡觉,没有的话继续数数,如果已睡,则停止数数。

volatile boolean asleep;

while(!asleep){

   countNum();

}

在考虑使用 volatile 时,思考下面问题

1. 写入变量时是否依赖变量的当前值?或者是否只有一个线程执行写操作?

如果不依赖或者能确定只有一个线程写则可以考虑

2. 变量是否要与其他变量一起参与不变约束?

如果没有则可以考虑。

3. 访问变量时,是否有其他原因需要加锁?

如果没有则可以考虑。


关于CAS和原子变量的信息可参见http://kenwublog.com/the-theory-of-volatile


 

 

 

 

读-写锁

读写锁能够保证一个资源能同时被多个读者访问,或者只被一个写者访问。当对容器“读”操作较多,而很少写的时候,使用ReadWriteLock比使用ReentrantLock能获得更高的吞吐量。如为LinkedHashMap提供更高的并发访问。

ReadWriteLock lock = new ReentrantReadWriteLock();
Lock w = lock.writeLock();//获得"写锁"实例
Lock r = lock.readLock()//获得“读锁”实例

//对写操作加锁
w.lock();
try{
   //write operation
}finally{
   w.unlock();
}
//对读操作加锁
r.lock();
try{
   //read operation
}finally{
   r.unlock();
}
 

 

能够用同一个读写锁保护不同的资源么?

 

阅读材料

http://wenku.baidu.com/view/a0104d39580216fc700afd90.html

http://www.jdon.com/concurrency.html

【公司源码查看】: UserAccountLockService

分享到:
评论

相关推荐

    Java并发锁简介-动力节点共9页.pdf.zip

    本资料“Java并发锁简介-动力节点共9页.pdf.zip”似乎提供了关于Java并发锁的基础介绍。下面将详细阐述Java并发锁的相关知识点。 一、Java并发基础 在多线程环境中,多个线程可能同时访问共享资源,这可能导致数据...

    java并发锁面试知识

    java中的乐观锁与悲观锁,synchronized与ReentrantLock重入锁的说明与比较

    java并发编程实战源码,java并发编程实战pdf,Java

    《Java并发编程实战》是Java并发编程领域的一本经典著作,它深入浅出地介绍了如何在Java平台上进行高效的多线程编程。这本书的源码提供了丰富的示例,可以帮助读者更好地理解书中的理论知识并将其应用到实际项目中。...

    Java 并发编程实战.pdf

    在并发控制方面,《Java并发编程实战》可能会探讨不同类型的锁,如互斥锁(Mutex)、读写锁(ReadWriteLock)、乐观锁和悲观锁等,以及它们的应用场景和性能影响。作者可能会使用实例代码来演示如何在实际应用中使用...

    java并发编程2

    Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。以下是对标题和描述中所提及的几个知识点的详细解释: 1. **线程与并发** - **线程*...

    《java 并发编程实战高清PDF版》

    锁是Java并发编程中用于同步的关键工具。书中深入剖析了各种锁机制,如内置锁(也称为监视器锁),通过`synchronized`关键字实现。此外,还介绍了高级的锁接口`java.util.concurrent.locks`,如`ReentrantLock`,它...

    java并发编程艺术

    锁机制是Java并发编程中的另一大主题,包括内置锁(互斥锁)和显式锁(如`ReentrantLock`)。内置锁是`synchronized`关键字提供的,而显式锁提供了更细粒度的控制和更丰富的功能。书中可能还会讨论读写锁(`...

    基于JDK源码解析Java领域中的并发锁,我们需要特别关注哪些内容?

    基于JDK源码解析Java并发锁,我们需要关注以下几个关键知识点: 1. **AQS(AbstractQueuedSynchronizer)基础同步器**: AQS是一个用于构建锁和同步器的框架,它维护了一个FIFO的等待队列,提供了两种模式:独占和...

    JAVA并发编程艺术 高清pdf

    JAVA并发编程艺术 高清pdf : 1.并发变成的挑战 2. java并发机制的底层实现原理 3. java 内存模型 4. java并发编程基础 5.java中的锁。。。。。。。

    java并发编程实践pdf笔记

    Java并发编程实践是Java开发中不可或缺的一个领域,它涉及到如何高效、正确地处理多线程环境中的任务。这本书的读书笔记涵盖了多个关键知识点,旨在帮助读者深入理解Java并发编程的核心概念。 1. **线程和进程的...

    java并发编程内部分享PPT

    Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。这份“java并发编程内部分享PPT”显然是一个深入探讨这一主题的资料,旨在帮助开发者...

    java并发编程实战(英文版)

    ### Java并发编程实战知识点概述 #### 一、Java并发特性详解 在《Java并发编程实战》这本书中,作者深入浅出地介绍了Java 5.0和Java 6中新增的并发特性。这些特性旨在帮助开发者更高效、安全地编写多线程程序。书中...

    JAVA并发编程艺术pdf版

    《JAVA并发编程艺术》是Java开发者深入理解和掌握并发编程的一本重要著作,它涵盖了Java并发领域的核心概念和技术。这本书详细阐述了如何在多线程环境下有效地编写高效、可靠的代码,对于提升Java程序员的技能水平...

    Java并发编程实践高清pdf及源码

    《Java并发编程实践》是一本深入探讨Java多线程编程的经典著作,由Brian Goetz、Tim Peierls、Joshua Bloch、Joseph Bowles和David Holmes等专家共同编写。这本书全面介绍了Java平台上的并发编程技术,是Java开发...

    (PDF带目录)《Java 并发编程实战》,java并发实战,并发

    《Java 并发编程实战》是一本专注于Java并发编程的权威指南,对于任何希望深入了解Java多线程和并发控制机制的开发者来说,都是不可或缺的参考资料。这本书深入浅出地介绍了如何在Java环境中有效地管理和控制并发...

    java并发编程书籍

    Java并发编程是软件开发中的一个关键领域,尤其是在大型企业级应用和分布式系统中。通过学习相关的书籍,开发者可以深入理解如何有效地设计和实现高效的多线程应用程序,避免并发问题,如竞态条件、死锁、活锁等。...

    JAVA并发编程实践.pdf+高清版+目录 书籍源码

    Java并发API包括了线程、锁、同步、并发容器等丰富的工具,使得开发者可以构建能够充分利用多核处理器性能的应用程序。本书详细介绍了这些主题,并提供了实例代码和实践建议。 首先,书中详细讨论了Java线程的创建...

Global site tag (gtag.js) - Google Analytics