当前位置:首页 > 开发 > 编程语言 > Java > 正文

笔记《Java并发编程实战》[3]

发表于: 2012-08-07   作者:braveCS   来源:转载   浏览次数:
摘要: 锁 1)内置锁:synchronized 2)Lock 和 ReentrantLock:非公平(默认)\公平,可重入 3)读-写锁:ReentrantReadWriteLock.ReadLock, ReentrantReadWriteLock.WriteLock 4)条件队列:【来源】:它使得一组线程(等待线程集合)能够通过某种方式来等待特定的条件变成真。条件队列中的元素是一个个正在等待相

1)内置锁:synchronized

2Lock ReentrantLock:非公平(默认)\公平,可重入

3)读-写锁:ReentrantReadWriteLock.ReadLock, ReentrantReadWriteLock.WriteLock

4条件队列:【来源】:它使得一组线程(等待线程集合)能够通过某种方式来等待特定的条件变成真。条件队列中的元素是一个个正在等待相关条件的线程。 

       正如每个Java对象都可以作为一个锁,每个对象同样可以作为一个条件队列,并且Object中的waitnotifynotifyAll方法就构成了内部队列的API。对象的内置锁与其内部条件队列是相关联的。要调用对象X中条件对象的任何任何一个方法,必须持有对象X上的锁。就是因为“等待由状态构成的条件”与“维护状态一直”这两个机制必须被紧密地绑定在一起:只有能对状态进行检查时,才能在某个条件上等待,并且只有能修改状态是,才能从条件等待中释放另一个线程。

       Object.wait会自动释放锁,并请求操作系统挂起当前线程,从而使其他线程能够获得这个锁并修改对象的状态。当被挂起的线程醒来时,它将在返回之前重新获取锁。

示例代码1

public class CS
{
	public static void main(String[] args)
	{
		final CS cs=new CS();		
		new Thread(new Runnable(){
			public void run() {
				synchronized(cs) 
				{
					try {
						Thread.currentThread().sleep(1000);
					} catch (InterruptedException e1) {
						return;
					}
					cs.notify();
					for(int i=0;i<100000000;i++);
					System.out.println("after notify");
				}
			}
		}).start();		
		cs.haha();
	}
	
	public void haha()
	{
		synchronized(this) 
		{
			System.out.println(this);			
			try {
				//在其他线程调用此对象的 notify()方法或 notifyAll()方法前,导致当前线程等待,并且释放所有持有对象的lock。
				this.wait(); 
			} catch (InterruptedException e) {
				return;
			}
			System.out.println("after wait");
		}
	}
}

 

 

示例代码2

 

public class BoundedBuffer<V> extends BaseBoundedBuffer<V>
{
	//条件谓词:not-full(!isFull())
	//条件谓词:not-empty(!isEmpty())
	public BoundedBuffer(int size){ super(size);}
	
	//阻塞并直到:not-full
	public synchronized void put(V v) throws InterruptedException
	{
		while(isFull())  //循环为防止过早唤醒
			wait();
		doPut(v);
		notifyAll();   //为避免丢失信号
	}
	
	//阻塞并直到:not-empty
	public synchronized V take() throws InterruptedException
	{
		while(isEmpty())
			wait();
		V v=doTake();
		notifyAll();
		return c;
	}
}

 

在条件等待中存在一种重要的三元关系,包括加锁、wait方法和一个条件谓词。在条件谓词中包含多个状态变量,而状态变量由一个锁来保护,因此在测试条件谓词之前必须先持有这个锁。锁对象与条件队列对象(即调用waitnotify等方法所在的对象)必须是同一个对象。状态依赖方法的标准形式:

 

void stateDependentMethod() throw InterruptedException
{
	synchronized(lock)
{
	while(!conditionPredicate())
		lock.wait();
}
}

 

 

5Condition:一种广义的内置条件队列。类似Lock之于Synchronized。一个Condition和一个Lock关联在一起,就像一个条件队列和一个内置锁相关联一样。要创建一个Condition,可以再相关联的Lock上调用Lock.newCondition方法。

6AbstractQueuedSynchronizerAQS):许多同步类的几类,是一个构建锁和同步器的框架。许多同步器都可以通过AQS很容易并高效的构造出来:ReentrantLockSemaphoreCountDoenLacthReentrantReadWriteLockSynchronousQueueFutureTask

7)原子变量类

 

笔记《Java并发编程实战》[3]

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
关键字: 原子操作:原子为不可再分操作。 Violation :可见关键字。 Synchronized:内部隐示锁 Ree
为啥需要并发: 个人英雄主义,单人独写xx软件的传奇,回味孤独英雄的寂寞。 系统运行也不是单个计
关键字: 原子操作:原子为不可再分操作。 Violation :可见关键字。 Synchronized:内部隐示锁 Ree
Java 7并发编程实战手册 本书是 Java 7 并发编程的实战指南,介绍了Java 7 并发API 中大部分重要而
学习了Scala并发编程实战初体验及其在Spark源码中的应用解析,具体来说Scala就是通过并发的Actor。
《Erlang/OTP并发编程实战》 基本信息 原书名:Erlang and OTP in Action 作者: (美)洛根(Logan,M.
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17288243 加锁(synchronized同步
CLH算法实现 CLH队列中的结点QNode中含有一个locked字段,该字段若为true表示该线程需要获取锁,且
在前面章节中指出,要编写正确的并发程序,关键的问题在于对共享变量的可变状态需要正确的管理,介
本书基本上是围绕线程和同步, 锁来讲如何实现并发编程, 并结合一些设计模式从中找到一些并发编程的
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号