<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>中文 &#187; xiaoxiaosunzhao</title>
	<atom:link href="http://software.intel.com/zh-cn/blogs/author/xiaoxiaosunzhao/feed/" rel="self" type="application/rss+xml" />
	<link>http://software.intel.com/zh-cn/blogs</link>
	<description></description>
	<lastBuildDate>Mon, 28 May 2012 14:23:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>多线程 (wait)</title>
		<link>http://software.intel.com/zh-cn/blogs/2011/08/03/wait/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2011/08/03/wait/#comments</comments>
		<pubDate>Wed, 03 Aug 2011 09:57:13 +0000</pubDate>
		<dc:creator>xiaoxiaosunzhao</dc:creator>
				<category><![CDATA[博客征文专栏]]></category>
		<category><![CDATA[并行计算]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2011/08/03/wait/</guid>
		<description><![CDATA[  1. 如果线程1获取锁A和B后，调用B.wait, 这时 线程1只是释放了锁B，仍然持有锁A（已验证） 所以，obj.wait调用注意的两点是： 1. 当前线程已经持有obj的锁, 即需要先synchronized(obj)，不然可能造成不能唤醒当前线程， 因为:obj.wait后，当前线程进入obj的monitor的等待队列(一个线程最多在一个monitor的等待队列中) 2. obj.wait仅仅是是否当前线程对obj的monitor的持有，如果当前线程持有其他对象的monitor， 那么不会释放其他对象的monitor的(也无法做到，因为一旦wait了就无法再向下执行代码了) ps：notify也是针对调用方法的对象的monitor的 2. 如果有线程在A对象上的monitor进行wait，那么所有剩余其他线程取得A对象的monitor后，在释放A的monitor之前（例如：synchronized后一个大括号之前）， 都在A的monitor上调用notifyAll（保险的办法是：取得monitor后都立即调用该对象的notifyAll，让monitor的等待队列中的线程都变成阻塞队列中的线程(忙等待)） 3. 如果所有线程都在A对象的monitor没有wait，那么要么处于执行，要忙等待(阻塞)，是不需要notify来唤醒的。 4. 获取对象的monitor的期间，最好只进行原子操作，例如，从队列中取得队列的一个元素，取得队列元素总数等待，不能进行耗时操作(网络接口调用或者大量代码的执行) 也就是仅仅对 操作[需要同步的对象(比如下载任务队列)]的代码才应该放在取得monitor的期间执行，即：这些代码应该都是操作同步对象的，否则很可能是多余的。]]></description>
			<content:encoded><![CDATA[<p> </p>
<p>1. 如果线程1获取锁A和B后，调用B.wait, 这时</p>
<p>线程1只是释放了锁B，仍然持有锁A（已验证）</p>
<p>所以，obj.wait调用注意的两点是：</p>
<p>1. 当前线程已经持有obj的锁, 即需要先synchronized(obj)，不然可能造成不能唤醒当前线程，</p>
<p>因为:obj.wait后，当前线程进入obj的monitor的等待队列(一个线程最多在一个monitor的等待队列中)</p>
<p>2. obj.wait仅仅是是否当前线程对obj的monitor的持有，如果当前线程持有其他对象的monitor，</p>
<p>那么不会释放其他对象的monitor的(也无法做到，因为一旦wait了就无法再向下执行代码了)</p>
<p>ps：notify也是针对调用方法的对象的monitor的</p>
<p>2. 如果有线程在A对象上的monitor进行wait，那么所有剩余其他线程取得A对象的monitor后，在释放A的monitor之前（例如：synchronized后一个大括号之前），</p>
<p>都在A的monitor上调用notifyAll（保险的办法是：取得monitor后都立即调用该对象的notifyAll，让monitor的等待队列中的线程都变成阻塞队列中的线程(忙等待)）</p>
<p>3. 如果所有线程都在A对象的monitor没有wait，那么要么处于执行，要忙等待(阻塞)，是不需要notify来唤醒的。</p>
<p>4. 获取对象的monitor的期间，最好只进行原子操作，例如，从队列中取得队列的一个元素，取得队列元素总数等待，不能进行耗时操作(网络接口调用或者大量代码的执行)</p>
<p>也就是仅仅对 操作[需要同步的对象(比如下载任务队列)]的代码才应该放在取得monitor的期间执行，即：这些代码应该都是操作同步对象的，否则很可能是多余的。</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2011/08/03/wait/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

