- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
单元8网络编程与多线程应用8.6多线程的同步程序设计
多线程的同步如何解决资源共享的问题?共享资源加锁所有解决多线程资源冲突问题的方法,都是在给定时间只允许一个线程访问共享资源,相当于给共享资源加道锁。使用代码块实现线程同步使用方法实现线程同步
多线程的同步使用代码块实现线程同步同步机制使用synchronized关键。每个Java对象都有一个内置锁,如果代码块使用synchronized关键字进行声明,通过锁定指定的对象,来对同步块中包含的代码进行同步,则使用该关键字的代码块称为同步块,也称为临界区。synchronized(Object)同步代码与同步方法锁的是对象,而不是代码。如果某个对象被同步代码块或同步方法锁住了,那么其他使用该对象的代码必须等待,直到该对象的锁被释放。
publicclassSynchronizedTestimplementsRunnable{intnum=10;//设置当前总票数publicvoidrun(){while(true){//设置无限循环synchronized(this){//设置同步代码块if(num0){//判断当前票数是否大于0try{Thread.sleep(100);//使当前线程休眠100毫秒}catch(Exceptione){e.printStackTrace();}System.out.println(Thread.currentThread().getName()+“---票数+num--;}}}}publicstaticvoidmain(String[]args){SynchronizedTestt=newSynchronizedTest();ThreadtA=newThread(t,线程1);ThreadtB=newThread(t,线程2);ThreadtC=newThread(t,线程3);ThreadtD=newThread(t,线程4);tA.start();//分别启动线程tB.start();tC.start();tD.start();}}示例:使用同步块模拟售票系统,解决一票多卖的现象运行结果:
每个Java对象都有一个内置锁,如果方法使用synchronized关键字进行声明,内置锁就会保护整个方法。在在调用该方法前,需要获得内置锁,否则程序将会处于阻塞状态。使用方法实现线程同步publicsynchronizedvoidf(){}多线程的同步
示例:使用同步方法解决模拟售票系统的资源共享问题。publicclassSynchronizedTest1implementsRunnable{intnum=10;//设置当前总票数publicsynchronizedvoidf(){if(num0){//判断当前票数是否大于0try{Thread.sleep(100);//使当前线程休眠100毫秒}catch(Exceptione){e.printStackTrace();}System.out.println(Thread.currentThread().getName()+--票数+num--);}}publicvoidrun(){while(true){f();}}publicstaticvoidmain(String[]args){//实例化类对象SynchronizedTest1t=newSynchronizedTest1();//以该类对象分别实例化4个线程ThreadtA=newThread(t,线程1);ThreadtB=newThread(t,线程2);ThreadtC=newThread(t,线程3);ThreadtD=newThread(t,线程4);tA.start();//分别启动线程tB.st
文档评论(0)