- 1、本文档共57页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
* * cont. pop()方法所指向的条目存在不一致的数据,然而pop方法要将下标值减1。 buffer |p|q|r| | | | idx = 1 ^ 这实际上将忽略了字符“r”。此后,它将返回字符“q”。 * * 对象锁标志 每个对象都有一个标志,被认为是--锁标志 synchronized允许和锁标志交互。即允许独占地存取对象. public void push(char c) { synchronized( this ) { data[idx] = c; idx++; } } 修改过的代码片断 * * 当线程运行到synchronized语句,它检查作为参数传递的对象,并在继续执行之前试图从对象获得锁标志。 * * * * 下图显示了如果pop()受到synchronized的影响,且另一个线程在原线程持有那个对象的锁时试图执行pop()方法时所发生的事情: * * 同步方法: 同步方法是通过在方法的声明前面加synchronized创建的. 对于任何给定的对象,一旦一个同步方法被调用,则该对象被锁定,同一个对象的同步方法就不能被另一个执行的线程所使用. 其他试图调用一个使用中的同步对象的线程将进入等待状态,直到该同步线程被解锁. * * 当一个线程离开同步方法时,对象锁被释放. 构造方法无须同步,构造方法不能声明为synchronized。 当一个继承类覆盖同步方法时,新方法既可以是同步也可以不是。 * * 同步语句: 同步语句由两部分组成: 要锁定的对象 获得锁时的执行语句 格式: synchronized ( obj ){ statements } obj 必须产生要锁定的对象,这个表达式通常为一个对象引用. * * 释放锁标志 持有锁标志的线程执行到synchronized()代码块末尾时将释放锁。 Java技术特别注意了保证即使出现中断或异常而使得执行流跳出synchronized()代码块,锁也会自动返回 锁标志将自动返回给它的对象 * * synchronized-放在一起 所有对易碎数据的存取应当同步。 由synchronized保护的易碎数据应当是private的。 一个方法,如果它全部属于与这个实例同步的块,它可以把synchronized关键字放到它的头部 * * cont. 下面两段代码是等价的: public void push(char c) { synchronized(this) { : } } public synchronized void push(char c) { : } * * 死锁 两个线程相互等待来自对方的锁 它不能被监测到或避免 它可以通过以下方法来避免: 决定获取锁的次序 始终遵照这个次序 按照相反的次序释放锁 避免死锁的一个通用的经验法则是:决定获取锁的次序并始终遵照这个次序。按照与获取相反的次序释放锁。 * * 4.线程交互---wait(),notify()和notifyall() 条件: wait()、notify()和notifyAll()方法是所有对象的一部分,是由Object类实现的 为了让线程对一个对象调用wait()或notify(),线程必须锁定那个特定的对象。也就是说,只能在它们被调用的实例的同步块内使用wait()和notify() * * 池 等待池:当线程执行包含对一个特定对象执行wait()调用的同步代码时,那个线程被放到与那个对象相关的等待池中。此外,调用wait()的线程自动释放对象的锁标志。 锁池:对一个特定对象执行notify()调用时,将从对象的等待池中移走一个任意的线程,并放到锁池中,那里的对象一直在等待,直到可以获得对象的锁标记。 notifyAll()方法将从等待池中移走所有等待那个对象的线程并放到锁池中。只有锁池中的线程能获取对象的锁标记,锁标记允许线程从上次因调用wait()而中断的地方开始继续运行。 * * wait()方法 使当前线程主动释放互斥锁,并进入该互斥锁的等待池,(它使当前线程暂停执行,等待其他线程执行notify()方法或notifyAll()方法后继续,移到对象锁池) public final void wait() throws InterruptedException public final void wait(long millis) throws InterruptedException public final void wait(long millis, int nanos) throws InterruptedException * * notify()和notifyAll() 唤醒其他等待池中的一个线
文档评论(0)