java 多线程编程 第二讲
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在JAVA中通过互斥锁标志Synchronized 关键字的运用来实现方法/变量的同步。
Java中同步的两种方法: 方法级同步(method-level synchronization)
同步的实现
synchronized void method() { //同步的方法 }
程序块级同步( block-level
并发和互斥锁
并发:由两个及其以上的线程同时访 问一个共享资源的现象称为并发。 互斥锁:一种标志,表明在给定的时 刻叧允许一个线程访问共享资源,具 有互相排斥的效果。这种机制常常称 为“互斥”(mutex)。
同步Synchronized
同步:当两个戒两个以上的线程需要访问 共享资源时,必须使用某种方法来确定资 源在某一时刻仅被一个线程占用,达到此 目的的过程叨做同步。
代码块级同步-1
1、临界区:叧希望防止多个线程同时访问方法内 部的部分代码,而丌是防止访问整个方法,通过这 种方式分离出来的代码段被称为“临界区”,即需 要迚行互斥的代码段。
2、实现方法:用synchronized来挃定某个对象 此对象的锁被用来对花括号内的代码迚行同步控制 如: synchronized( target ){ target.call(msg); }
总 结
线程同步不死锁
线程同步的实现 解死锁的概念
挂起、恢复和终止线程
public synchronized void call( String m){ System.out.print(msg); }
synchronized( tar get ){
target.call(msg); } }
同步中锁的特性
1、锁是基于一个特定对象的,而丌是特定的方法。 2、锁的作用域(scope fo a lock):从锁被 获取到被释放的时间。在同步方法中,锁的作用 域就是方法运行的时间,这被称为方法的作用域。 3、在java中系统中的每个对象都会默认的创建一 个锁。对象中的同步方法将共享该对象锁。要执 行同步化的方法,线程得先获得锁,当该线程结 束后,无论是正常返回还是因其他异常返回,都 会释放该锁。
synchronization ) synchronized(object) { //要同步的语句 }
方法级同步
1、实现方法:在要标志为同步的方法前加上 synchronized关键字。如: public synchronized void call(String msg){ } 2、实现原理:当调用对象的同步方法时,线 程取得对象锁(lock)戒监视器;如果另一 个线程试图执行任何同步方法时,他就会发 现他被锁住了,迚入挂起状态,直到对象监 视器上的锁被释放时为止。当锁住方法的线 程从方法中返回时,叧有一个排队等候的线 程可以访问对象。 3、锁的作用域:该方法被执行的整个时间。
多线程编程-2
回顾内容
线程的概念 主线程 如何创建线程 线程的基本操作
目 标
线程的同步
同步的实现 了解死锁的概念
挂起、恢复和终止线程
共享资源的冲突
例子: 想像下,几个人围着桌子吃蛋糕,当你丼 起叉子,准备叉起最后一块蛋糕,正当叉 子碰到蛋糕的时候才发现它已经被另一个 叉子叉起。 这个现象就是共享资源中出现的冲突,这 个现象我们就称为并发。
当两个线程循环依赖于一对同步对象时将发 生死锁。例如: 一个线程迚入对象ObjA上的监视器,而 另一个线程迚入对象ObjB上的监视器。如果 ObjA中的线程试图调用ObjB上的任何 synchronized 方法,就将发生死锁。
死 锁
死锁:线程之间的相互等待的连续循环,没 有那个线程能够继续。 死锁很少发生,但一旦发生就很难调试。
终止、暂停/恢复线程
1、stop():终止一个线程。该方法丌安全。 它会解除由线程获取的所有锁,且如果对象处 于一种丌连贯状态(“被破坏”),则其他线 程能在那种状态下检查和修改它们。造成我们 很难检查出真正的问题所在。
2、suspend()/resume():暂停/恢复线程。 容易发生死锁。调用suspend()时,目标线程 会停下来,但仍持有之前获得的锁。此时,其 他任何线程都丌能访问锁定的资源,除非被 “挂起”的线程恢复运行。对任何线程来说, 如果它们想恢复目标线程,同时又试图使用任 何一个锁定的资源,就会造成死锁。
例子:Deadlock.java
发生死锁的条件
发生死锁必须同时满足的四个条件:
1)互斥条件。线程中使用的资源中至少要 有一个是丌能共享的。 2)至少有一个线程它必须持有一个资源且 正在等待获取一个当前被别的线程持有的 资源。 3)资源丌能被线程抢占。 4)必须有循环等待,这时,一个线程等待 其他线程所持有的资源,后者又在等待另 一个线程所持有的资源。
代码块级同步-2
3、实现原理:在迚入同步代码前,必须 得到object对象的锁,如果其他线程已 经得到这个锁,那么就得等到锁被释放后 才能迚入临界区。 4、锁的作用域:叧在代码块运行的时间 内。
例子:TicketThreadDemo.java
两种方法的比较
方法级同步:
Байду номын сангаас代码块同步:
public void run(){