全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
关于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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026贵州六盘水市文化馆招聘备考题库附答案详解(培优b卷)
- 2026江苏南京中医药大学招聘1人备考题库附答案详解(精练)
- 2026贵州安顺经济技术开发区市场监督管理局招聘公益性岗位人员1人备考题库含答案详解(考试直接用)
- 2026江苏航运职业技术学院招聘14人备考题库附答案详解(巩固)
- 2026年教师资格证《综合素质》培训试卷
- 核心素养视域下初中英语八年级上册Unit 6人与自然主题单元整体教学设计与实施
- 小学六年级数学下册:排队问题探究与建模教案
- 小学英语六年级下册《身高体重比较与描述》单元教案
- 初中道德与法治七年级下册整合式教学设计
- 大单元视域下基于真实问题驱动的跨学科实践探究-“使用机械是否省功”课时教案(八年级物理下册·北师大版2024)
- 高等学校实验室安全检查项目表(2026年)
- 危险化学品安全管理制度及事故应急预案
- 基于神经网络的大豆期货价格预测:方法、实践与应用
- 防蛇咬知识培训
- 长春医高专考试大纲校考
- DB11∕T 435-2021 杏生产技术规程
- 工商银行科目一考试真题试卷(2篇)
- 三年级数学两位数乘两位数竖式练习题-500道题-A4可直接打印
- 实施指南(2025)《EJT 586-2014 固定式 α 和 β 辐射个人表面污染监测装置》
- 病房消毒隔离制度课件
- 《高海拔地区模块化增压式建筑技术标准》
评论
0/150
提交评论