当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

分两种情况

1):进入此对象的非同步方法

答案:可以

2):进入此对象的同步方法

答案:不可以

sleep指线程被调用时,占着CPU不工作,形象地说明为“占着CPU睡觉”,此时,系统的CPU部分资源被占用,其他线程无法进入,会增加时间限制。wait指线程处于进入等待状态,形象地说明为“等待使用CPU”,此时线程不占用任何资源,不增加时间限制。所以sleep(100L)意思为:占用CPU,线程休眠100毫秒wait(100L)意思为:不占用CPU,线程等待100毫秒

JAVA中线程同步的方法(7种)汇总

同步的方法:

一、同步方法

即有synchronized关键字修饰的方法。 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。
注: synchronized关键字也可以修饰静态方法,此时如果调用该静态方法,将会锁住整个类。

二、同步代码块

即有synchronized关键字修饰的语句块。 被该关键字修饰的语句块会自动被加上内置锁,从而实现同步
代码如: 
synchronized(object){
}

注:同步是一种高开销的操作,因此应该尽量减少同步的内容。通常没有必要同步整个方法,使用synchronized代码块同步关键代码即可。 
    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)实现线程同步

a.volatile关键字为域变量的访问提供了一种免锁机制
b.使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新
c.因此每次使用该域就要重新计算,而不是使用寄存器中的值 
d.volatile不会提供任何原子操作,它也不能用来修饰final类型的变量 
例如: 
在上面的例子当中,只需在account前面加上volatile修饰,即可实现线程同步。 
代码实例: 
        //只给出要修改的代码,其余代码与上同class Bank {//需要同步的变量加上volatileprivate volatile int account = 100;public int getAccount() {return account;}//这里不再需要synchronized public void save(int money) {account += money;}}

五、使用重入锁实现线程同步

在JavaSE5.0中新增了一个java.util.concurrent包来支持同步。 
ReentrantLock类是可重入、互斥、实现了Lock接口的锁,它与使用synchronized方法和快具有相同的基本行为和语义,并且扩展了其能力。
ReenreantLock类的常用方法有:
ReentrantLock() : 创建一个ReentrantLock实例
lock() : 获得锁
unlock() : 释放锁 

注:ReentrantLock()还有一个可以创建公平锁的构造方法,但由于能大幅度降低程序运行效率,不推荐使用 
例如: 
在上面例子的基础上,改写后的代码为: 
       //只给出要修改的代码,其余代码与上同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();}}}

 注:关于Lock对象和synchronized关键字的选择: 
a.最好两个都不用,使用一种java.util.concurrent包提供的机制,能够帮助用户处理所有与锁相关的代码。 
b.如果synchronized关键字能满足用户的需求,就用synchronized,因为它能简化代码 
c.如果需要更高级的功能,就用ReentrantLock类,此时要注意及时释放锁,否则会出现死锁,通常在finally代码释放锁 

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 线程同步的方法相关推荐

  1. JAVA中线程同步的方法(7种)汇总

    JAVA中线程同步的方法(7种)汇总 同步的方法: 一.同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法. ...

  2. Android面试之线程同步的方法

    一 什么是进程和线程?进程和线程的区别? 进程是资源分配的最小单元,线程是程序执行的最小单元(进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位) 进程有自己的独立地址空间,每启动一个 ...

  3. java实现线程同步的方法_Java实现线程同步方法及原理详解

    一.概述 无论是什么语言,在多线程编程中,常常会遇到多个线同时操作程某个变量(读/写),如果读/写不同步,则会造成不符合预期的结果. 例如:线程A和线程B并发运行,都操作变量X,若线程A对变量X进行赋 ...

  4. java 线程同步的方法_Java多线程同步方法

    Java多线程同步方法 package com.wkcto.intrinsiclock; /** * synchronized同步实例方法 * 把整个方法体作为同步代码块 * 默认的锁对象是this对 ...

  5. linux线程同步的方法

    #Linux 线程同步的三种方法 线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点.linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量和信号量. ##一.互斥锁 ...

  6. 线程同步的方法有哪些?

    一.线程同步和线程互斥 首先我们要清楚什么是线程同步和线程互斥: 1.线程同步:线程同步指的是多个线程之间协调同步,按照预定的先后次序进行运行,这种先后次序取决于要完成的特定任务,最基本的场景就是:A ...

  7. 【java】Java 中的 Exchanger 线程同步使用方法 线程之间交换数据

    1.概述 转载:https://www.pdai.tech/md/java/thread/java-thread-x-juc-tool-exchanger.html 视频参考:https://www. ...

  8. JAVA中线程同步的方法

    1.wait方法. 2.notify方法和notifyAll方法. 3.synchronized关键字.

  9. java线程同步的实现_【Java多线程系列三】实现线程同步的方法

    packagecom.concurrent.test;importjava.util.Stack;importjava.util.concurrent.ArrayBlockingQueue;impor ...

最新文章

  1. eclipse创建springboot项目_idea创建基于gradle构建的spring boot项目
  2. windows mysql源码安装配置_windows下MySQL5.6版本安装及配置过程附有截图和具体介绍...
  3. apache的产品分类说明
  4. Eureka和Zookeeper注册中心的区别
  5. java刷机_java非智能手机能不能通过刷机安装一个安卓智能系统
  6. Android viewpager 嵌套 viewpager滑动 点击事件冲突解决方案
  7. iReport 生成pdf分页问题
  8. 12864液晶中文资料JHD529m1
  9. 用vbs脚本实现软件的自动登录
  10. 计算机蓝牙快捷键,电脑蓝牙在哪里开?蓝牙快捷方式介绍
  11. 自动驾驶仿真测试标准ASAM OpenX简介
  12. 2022最新简约好用的夏雨图床系统源码+UI超好看
  13. 火锅赛道内卷:七欣天VS捞王,谁是 “港股火锅第三股”?
  14. AI: 企业数字化转型的简介、发展以及未来趋势
  15. 《安全周报》2011年7月第3期
  16. JG-OJ记录56:10:今夕是何年
  17. 二维火收银系统服务器超时,二维火收银系统,改变的不止是你的收银模式!
  18. Python画图——哆啦A梦
  19. 关于WSADuplicateSocket的理解
  20. 美国容错服务器维修,E-PAR Server容错服务器解决方案

热门文章

  1. 2020 我的C++的学习之路 第十章 对象和类
  2. 学计算机趣图,我的世界:六张玩家自制趣图,最后一张,想起了“骗”父母买电脑...
  3. python telnet 交互_用Python怎么telnet到网络设备
  4. 网工路由基础(4)EIGRP协议
  5. 简易linux修改ip,让Linux修改IP、DNS等可以更简单
  6. Sentinel Go 0.4.0 发布,支持热点流量防护能力
  7. CNCF 宣布首个中国原创项目 Harbor 毕业 | 云原生生态周报 Vol. 55
  8. python爬取京东商品图片_python利用urllib实现爬取京东网站商品图片的爬虫实例
  9. 三星android5.0基带,三星首款5G手机没用高通!问题来了:5G基带哪家强?
  10. linux python 调试_Python教程:4环境变量与集成开发