同步方法 sleep和wait 线程同步的方法
当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
分两种情况
1):进入此对象的非同步方法
答案:可以
2):进入此对象的同步方法
答案:不可以
sleep指线程被调用时,占着CPU不工作,形象地说明为“占着CPU睡觉”,此时,系统的CPU部分资源被占用,其他线程无法进入,会增加时间限制。wait指线程处于进入等待状态,形象地说明为“等待使用CPU”,此时线程不占用任何资源,不增加时间限制。所以sleep(100L)意思为:占用CPU,线程休眠100毫秒wait(100L)意思为:不占用CPU,线程等待100毫秒
JAVA中线程同步的方法(7种)汇总
同步的方法:
一、同步方法
二、同步代码块
synchronized(object){ }
package com.xhj.thread;/*** 线程同步的运用* * @author XIEHEJUN* */public class SynchronizedThread {class Bank {private int account = 100;public int getAccount() {return account;}/*** 用同步方法实现* * @param money*/public synchronized void save(int money) {account += money;}/*** 用同步代码块实现* * @param money*/public void save1(int money) {synchronized (this) {account += money;}}}
三、wait与notify
wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。
四、使用特殊域变量(volatile)实现线程同步
//只给出要修改的代码,其余代码与上同class Bank {//需要同步的变量加上volatileprivate volatile int account = 100;public int getAccount() {return account;}//这里不再需要synchronized public void save(int money) {account += money;}}
五、使用重入锁实现线程同步
ReentrantLock() : 创建一个ReentrantLock实例 lock() : 获得锁 unlock() : 释放锁
//只给出要修改的代码,其余代码与上同class Bank {private int account = 100;//需要声明这个锁private Lock lock = new ReentrantLock();public int getAccount() {return account;}//这里不再需要synchronized public void save(int money) {lock.lock();try{account += money;}finally{lock.unlock();}}}
7.使用原子变量实现线程同步
需要使用线程同步的根本原因在于对普通变量的操作不是原子的。
那么什么是原子操作呢?原子操作就是指将读取变量值、修改变量值、保存变量值看成一个整体来操作即-这几种行为要么同时完成,要么都不完成。在java的util.concurrent.atomic包中提供了创建了原子类型变量的工具类,使用该类可以简化线程同步。其中AtomicInteger 表可以用原子方式更新int的值,可用在应用程序中(如以原子方式增加的计数器),但不能用于替换Integer;可扩展Number,允许那些处理机遇数字类的工具和实用工具进行统一访问。
AtomicInteger类常用方法:
AtomicInteger(int initialValue) : 创建具有给定初始值的新的
AtomicIntegeraddAddGet(int dalta) : 以原子方式将给定值与当前值相加
get() : 获取当前值
代码实例:
只改Bank类,其余代码与上面第一个例子同
class Bank {private AtomicInteger account = new AtomicInteger(100);public AtomicInteger getAccount() {return account; } public void save(int money) {account.addAndGet(money);} }
转载于:https://www.cnblogs.com/jianxin-lilang/p/6445631.html
同步方法 sleep和wait 线程同步的方法相关推荐
- JAVA中线程同步的方法(7种)汇总
JAVA中线程同步的方法(7种)汇总 同步的方法: 一.同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法. ...
- Android面试之线程同步的方法
一 什么是进程和线程?进程和线程的区别? 进程是资源分配的最小单元,线程是程序执行的最小单元(进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位) 进程有自己的独立地址空间,每启动一个 ...
- java实现线程同步的方法_Java实现线程同步方法及原理详解
一.概述 无论是什么语言,在多线程编程中,常常会遇到多个线同时操作程某个变量(读/写),如果读/写不同步,则会造成不符合预期的结果. 例如:线程A和线程B并发运行,都操作变量X,若线程A对变量X进行赋 ...
- java 线程同步的方法_Java多线程同步方法
Java多线程同步方法 package com.wkcto.intrinsiclock; /** * synchronized同步实例方法 * 把整个方法体作为同步代码块 * 默认的锁对象是this对 ...
- linux线程同步的方法
#Linux 线程同步的三种方法 线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点.linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量和信号量. ##一.互斥锁 ...
- 线程同步的方法有哪些?
一.线程同步和线程互斥 首先我们要清楚什么是线程同步和线程互斥: 1.线程同步:线程同步指的是多个线程之间协调同步,按照预定的先后次序进行运行,这种先后次序取决于要完成的特定任务,最基本的场景就是:A ...
- 【java】Java 中的 Exchanger 线程同步使用方法 线程之间交换数据
1.概述 转载:https://www.pdai.tech/md/java/thread/java-thread-x-juc-tool-exchanger.html 视频参考:https://www. ...
- JAVA中线程同步的方法
1.wait方法. 2.notify方法和notifyAll方法. 3.synchronized关键字.
- java线程同步的实现_【Java多线程系列三】实现线程同步的方法
packagecom.concurrent.test;importjava.util.Stack;importjava.util.concurrent.ArrayBlockingQueue;impor ...
最新文章
- eclipse创建springboot项目_idea创建基于gradle构建的spring boot项目
- windows mysql源码安装配置_windows下MySQL5.6版本安装及配置过程附有截图和具体介绍...
- apache的产品分类说明
- Eureka和Zookeeper注册中心的区别
- java刷机_java非智能手机能不能通过刷机安装一个安卓智能系统
- Android viewpager 嵌套 viewpager滑动 点击事件冲突解决方案
- iReport 生成pdf分页问题
- 12864液晶中文资料JHD529m1
- 用vbs脚本实现软件的自动登录
- 计算机蓝牙快捷键,电脑蓝牙在哪里开?蓝牙快捷方式介绍
- 自动驾驶仿真测试标准ASAM OpenX简介
- 2022最新简约好用的夏雨图床系统源码+UI超好看
- 火锅赛道内卷:七欣天VS捞王,谁是 “港股火锅第三股”?
- AI: 企业数字化转型的简介、发展以及未来趋势
- 《安全周报》2011年7月第3期
- JG-OJ记录56:10:今夕是何年
- 二维火收银系统服务器超时,二维火收银系统,改变的不止是你的收银模式!
- Python画图——哆啦A梦
- 关于WSADuplicateSocket的理解
- 美国容错服务器维修,E-PAR Server容错服务器解决方案
热门文章
- 2020 我的C++的学习之路 第十章 对象和类
- 学计算机趣图,我的世界:六张玩家自制趣图,最后一张,想起了“骗”父母买电脑...
- python telnet 交互_用Python怎么telnet到网络设备
- 网工路由基础(4)EIGRP协议
- 简易linux修改ip,让Linux修改IP、DNS等可以更简单
- Sentinel Go 0.4.0 发布,支持热点流量防护能力
- CNCF 宣布首个中国原创项目 Harbor 毕业 | 云原生生态周报 Vol. 55
- python爬取京东商品图片_python利用urllib实现爬取京东网站商品图片的爬虫实例
- 三星android5.0基带,三星首款5G手机没用高通!问题来了:5G基带哪家强?
- linux python 调试_Python教程:4环境变量与集成开发