



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
关于JAVA多线程同步 1 wait方法: 该方法属于Object的方法,wait方法的作用是使得当前调用wait方法所在部分(代码块)的线程停止执行,并释放当前获得的调用wait所在的代码块的锁,并在其他线程调用notify或者notifyAll方法时恢复到竞争锁状态(一旦获得锁就恢复执行)。 调用wait方法需要注意几点: 第一点:wait被调用的时候必须在拥有锁(即synchronized修饰的)的代码块中。 第二点:恢复执行后,从wait的下一条语句开始执行,因而wait方法总是应当在while循环中调用,以免出现恢复执行后继续执行的条件不满足却继续执行的情况。 第三点:若wait方法参数中带时间,则除了notify和notifyAll被调用能激活处于wait状态(等待状态)的线程进入锁竞争外,在其他线程中interrupt它或者参数时间到了之后,该线程也将被激活到竞争状态。 第四点:wait方法被调用的线程必须获得之前执行到wait时释放掉的锁重新获得才能够恢复执行。2 notify方法和notifyAll方法: notify方法通知调用了wait方法,但是尚未激活的一个线程进入线程调度队列(即进入锁竞争),注意不是立即执行。并且具体是哪一个线程不能保证。另外一点就是被唤醒的这个线程一定是在等待wait所释放的锁。 notifyAll方法则唤醒所有调用了wait方法,尚未激活的进程进入竞争队列。3 synchronized关键字: 第一点:synchronized用来标识一个普通方法时,表示一个线程要执行该方法,必须取得该方法所在的对象的锁。 第二点:synchronized用来标识一个静态方法时,表示一个线程要执行该方法,必须获得该方法所在的类的类锁。 第三点:synchronized修饰一个代码块。类似这样:synchronized(obj) /code. 。表示一个线程要执行该代码块,必须获得obj的锁。这样做的目的是减小锁的粒度,保证当不同块所需的锁不冲突时不用对整个对象加锁。利用零长度的byte数组对象做obj非常经济。4 atomic action(原子操作): 在JAVA中,以下两点操作是原子操作。但是c和c+中并不如此。 第一点:对引用变量和除了long和double之外的原始数据类型变量进行读写。 第二点:对所有声明为volatile的变量(包括long和double)的读写。 另外:在java.util.concurrent和java.util.concurrent.atomic包中提供了一些不依赖于同步机制的线程安全的类和方法。5 一个例子,该例子模仿多人存取同一个账户:Account类:package com.synchronize;import java.util.HashMap;import java.util.Iterator;public class Account private static HashMap m = new HashMap(); private static long times = 0; static m.put(ren, 1000); public synchronized void save(String name, int num) long tempTime = times+; System.out.println(第 + tempTime + 次存储 + num + 之前 + name + 的余额为: + m.get(name); m.put(name, m.get(name) + num); this.notify(); System.out.println(第 + tempTime + 次存储 + num + 之后 + name + 的余额为: + m.get(name); public static int get(String name) return m.get(name); /* * 注意wait的用法,必须在loop中,必须在拥有锁的代码块中。 前者是当被notify的时候要重新进行条件判断,后者是为了释放锁。 * * param name * param num */ public synchronized void load(String name, int num) long tempTime = times+; System.out.println(第 + tempTime + 次提取 + num + 之前 + name + 的余额为: + m.get(name); try while (m.get(name) num) System.out.println(第 + tempTime + 次提取 + 余额 + m.get(name) + 不足,开始等待wait。); this.wait(); System.out.println(第 + tempTime + 次提取操作被唤醒); catch (InterruptedException e) / TODO Auto-generated catch block e.printStackTrace(); m.put(name, m.get(name) - num); System.out.println(第 + tempTime + 次提取 + num + 之后 + name + 的余额为: + m.get(name); User类:package com.synchronize;/* * 这里注意runnable接口的线程是怎么实例化的。new Thread(new User() * 这里成功展示了多个用户存取同一个账户的多线程实例,通过多线程同步,保证了安全的执行。 * author abc * */public class User implements Runnable private static Account account = new Account(); private final int id; User(int i) id=i; public void run() int tempMoney = 100; account.load(ren, tempMoney); try Thread.sleep(3000); catch (InterruptedException e) / TODO Auto-generated catch block e.printStackTrace(); account.save(ren, 100); System.out.println(线程+
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 辽宁装备制造职业技术学院《生物制药工艺学实验》2023-2024学年第二学期期末试卷
- 山东省淄博市淄川区2025年小升初常考易错数学检测卷含解析
- 濮阳科技职业学院《住区规划设计》2023-2024学年第二学期期末试卷
- 六盘水幼儿师范高等专科学校《有机化学(下)》2023-2024学年第二学期期末试卷
- 2025年心理咨询师考试复习试卷及答案
- 2025年语言文学学科综合能力测评试卷及答案
- 2025年游戏开发与设计专业考试试卷及答案
- 2025年新能源科学与工程专业考试试卷及答案
- 遂宁职业学院《英美文学导读》2023-2024学年第一学期期末试卷
- 山西华澳商贸职业学院《土木工程施工与组织》2023-2024学年第二学期期末试卷
- 陕西省咸阳市2025届高三下学期高考模拟检测(三)物理试题(含答案)
- 浙江省温州市2023-2024学年高一下学期期末考试语文试卷(含答案)
- GB 38031-2025电动汽车用动力蓄电池安全要求
- 水果店运营与管理培训课件
- 1号卷·A10联盟2025届高三4月质检考物理试题及答案
- 2025年一级建造师之一建矿业工程实务题库附答案(典型题)
- 国家职业技能标准-(粮油)仓储管理员
- 履带式起重机进场验收表
- 汽车维修前台接待流程参考指导
- 大数据驱动的智慧社区建设研究
- 《人工智能生成合成内容标识办法》知识讲座
评论
0/150
提交评论