当前位置: 首页 > news >正文 国外网站开发南通网站建设知识 news 2025/11/3 18:07:05 国外网站开发,南通网站建设知识,上海抖音代运营,重庆市建设工程招标投标交易信息网文章目录 一、线程安全问题-内存可见性二、等待通知2.1 wait()方法2.2 notify()方法 一、线程安全问题-内存可见性 import java.util.Scanner;public class Demo27 {private static int count0;//下面这段代码会出现内存的可见性问题//将从内存中读取count值的操作称为load 判… 文章目录 一、线程安全问题-内存可见性二、等待通知2.1 wait()方法2.2 notify()方法 一、线程安全问题-内存可见性 import java.util.Scanner;public class Demo27 {private static int count0;//下面这段代码会出现内存的可见性问题//将从内存中读取count值的操作称为load 判断操作称为cmp//load和cmp的执行速度差了好几个数量级在线程2开始执行代码提示输入数字时线程1的while循环已经执行了很多遍//java编译器会自动给代码进行优化//导致load只是第一次时真正从内存中读取count值其余都是从cpu的寄存器中读取//然而线程2修改count是在内存中进行修改线程1根本访问不到count的值//可以在变量前加上volatile关键字来提醒编译器不要优化public static void main(String[] args) {Thread t1new Thread(()-{while(count0) {//}System.out.println(t1 执行结束);});Thread t2new Thread(()-{Scanner scannernew Scanner(System.in);System.out.println(输入数字);countscanner.nextInt();});t1.start();t2.start();}}以上代码建立一个线程t1和线程t2线程t1中建立一个循环线程t2控制循环中的条件按照预期应该在t2中改变条件之后t1结束整个程序也应该结束但事实并非如此。 输入数字之后线程一仍然没有结束这是因为count0这个条件涉及到两个操作load和cmp先将count的值从内存中载入cpu的寄存器进行比较在线程二中还未输入数字时线程一的循环已经执行很多次了编译器发现这么多次count的值没有变化就会进行优化只有第一个load会从内存中读count的值剩余次数都是直接用寄存器中的值这样既使后来在线程二当中改变了内存中的count的值因为循环条件的count不从内存中读值因此访问不到修改后的count线程一就会继续循环从而程序就结束不了。如果不想让编译器进行优化可以在count前面加上volatile关键字即可。 另外上述的内存可见性问题加锁即包含在synchronized内也可以解决因为加锁是比较重量的load相对就不算慢了就不会触发优化。在循环内加上sout输出语句也是一个道理sout相对于load更慢无法触发优化自然也能解决上述的内存可见性的问题。 在网上查询资料还可以看到以一种JMMjava内存模型角度来理解该问题的解答 当t1执行的时候会从工作内存中读取count而不是从主内存中。 t2修改count会先修改工作内存再同步到主内存但由于t1没有重新读主内存导致t1没有感知到t2的修改。 二、等待通知 2.1 wait()方法 代码示例如下 public class Demo28 {public static void main(String[] args) throws InterruptedException {Object locker new Object();System.out.println(等待之前);//wait必须在synchronized内使用会解锁并且让线程进入阻塞等待状态synchronized (locker) {locker.wait();}System.out.println(等待之后);} } wait方法是object类的方法任何类对象都可以使用它只能在锁内使用如果执行wait方法会释放锁并且线程进入阻塞状态waiting。wait也有限时的参数加上时间会在限定时间内阻塞之后自动唤醒。 注意wait和sleep一样可以被interrupt打断并且清空标志位。 2.2 notify()方法 通过notify方法来唤醒wait方法进入阻塞的线程wait的线程状态从Waiting-Runnable-Blocked。 代码示例如下 public class Demo29 {public static void main(String[] args) throws InterruptedException {Object locker new Object();//1.wait和notify必须都在synchronized内//2.一个notify唤醒一个wait() 如果多个线程wait就使用多个notify或者notifyAll 这种唤醒时随机的//3.如果想唤醒指定线程也可以必须一对一写好锁对象//4.notify需要在wait之后Thread t1 new Thread(() - {System.out.println(t1 等待之前);synchronized (locker) {try {locker.wait();} catch (InterruptedException e) {throw new RuntimeException(e);}}System.out.println(t1 等待之后);});Thread t2 new Thread(() - {System.out.println(t2 通知之前);Scanner scanner new Scanner(System.in);synchronized (locker) { //控制阻塞不输入数字t1仍是阻塞scanner.nextInt();locker.notify();}System.out.println(t2 通知之后);});t1.start();t2.start();}}notify必须也在synchronized之内并且一个notify只能唤醒对应的一个wait如果多个线程wait就使用多个notify或者notifyAll这种唤醒时随机的唤醒的前提是通过一个对象来调用的wait及notify方法。如果想唤醒指定线程也可以必须一对一写好锁对象。另外notify的使用必须在wait之后如果在wait之前使用notify不会有任何效果不过wait就没有办法唤醒了。 使用相应的锁对象进行一对一唤醒代码示例如下 public class Demo30 {public static void main(String[] args) throws InterruptedException {Object locker new Object();Object locker1 new Object();Thread t1 new Thread(() - {synchronized (locker) {System.out.println(t1等待之前);try {locker.wait();} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(t1等待之后);}});Thread t2 new Thread(() - {synchronized (locker1) {System.out.println(t2等待之前);try {locker1.wait();} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(t2等待之后);}});Thread t3 new Thread(() - {synchronized (locker) {//locker.notifyAll();locker.notify();}synchronized (locker1) {locker1.notify();}});t1.start();t2.start();Thread.sleep(1000);t3.start();}} 文章转载自: http://www.morning.yrfxb.cn.gov.cn.yrfxb.cn http://www.morning.ldcsw.cn.gov.cn.ldcsw.cn http://www.morning.dzgyr.cn.gov.cn.dzgyr.cn http://www.morning.sqnrz.cn.gov.cn.sqnrz.cn http://www.morning.c7493.cn.gov.cn.c7493.cn http://www.morning.tqgmd.cn.gov.cn.tqgmd.cn http://www.morning.ljzgf.cn.gov.cn.ljzgf.cn http://www.morning.wchsx.cn.gov.cn.wchsx.cn http://www.morning.rttp.cn.gov.cn.rttp.cn http://www.morning.zsyqg.cn.gov.cn.zsyqg.cn http://www.morning.xrpwk.cn.gov.cn.xrpwk.cn http://www.morning.bftr.cn.gov.cn.bftr.cn http://www.morning.wtnwf.cn.gov.cn.wtnwf.cn http://www.morning.fxwkl.cn.gov.cn.fxwkl.cn http://www.morning.rdmn.cn.gov.cn.rdmn.cn http://www.morning.ktmnq.cn.gov.cn.ktmnq.cn http://www.morning.zlff.cn.gov.cn.zlff.cn http://www.morning.snbq.cn.gov.cn.snbq.cn http://www.morning.frtt.cn.gov.cn.frtt.cn http://www.morning.cryb.cn.gov.cn.cryb.cn http://www.morning.bqnhh.cn.gov.cn.bqnhh.cn http://www.morning.mhpmw.cn.gov.cn.mhpmw.cn http://www.morning.lwygd.cn.gov.cn.lwygd.cn http://www.morning.mswkd.cn.gov.cn.mswkd.cn http://www.morning.yhxhq.cn.gov.cn.yhxhq.cn http://www.morning.c7500.cn.gov.cn.c7500.cn http://www.morning.sypzg.cn.gov.cn.sypzg.cn http://www.morning.tpchy.cn.gov.cn.tpchy.cn http://www.morning.cmfkp.cn.gov.cn.cmfkp.cn http://www.morning.rcjyc.cn.gov.cn.rcjyc.cn http://www.morning.nkyc.cn.gov.cn.nkyc.cn http://www.morning.rsszk.cn.gov.cn.rsszk.cn http://www.morning.ylkkh.cn.gov.cn.ylkkh.cn http://www.morning.dpplr.cn.gov.cn.dpplr.cn http://www.morning.syglx.cn.gov.cn.syglx.cn http://www.morning.tktcr.cn.gov.cn.tktcr.cn http://www.morning.rmltt.cn.gov.cn.rmltt.cn http://www.morning.gsyns.cn.gov.cn.gsyns.cn http://www.morning.sqdjn.cn.gov.cn.sqdjn.cn http://www.morning.qsy36.cn.gov.cn.qsy36.cn http://www.morning.mxtjl.cn.gov.cn.mxtjl.cn http://www.morning.mggwr.cn.gov.cn.mggwr.cn http://www.morning.tnhqr.cn.gov.cn.tnhqr.cn http://www.morning.lmnbp.cn.gov.cn.lmnbp.cn http://www.morning.jjtwh.cn.gov.cn.jjtwh.cn http://www.morning.rmjxp.cn.gov.cn.rmjxp.cn http://www.morning.qsy37.cn.gov.cn.qsy37.cn http://www.morning.hbdqf.cn.gov.cn.hbdqf.cn http://www.morning.zfzgp.cn.gov.cn.zfzgp.cn http://www.morning.ndltr.cn.gov.cn.ndltr.cn http://www.morning.lmctj.cn.gov.cn.lmctj.cn http://www.morning.kbdrq.cn.gov.cn.kbdrq.cn http://www.morning.yfnjk.cn.gov.cn.yfnjk.cn http://www.morning.xnqjs.cn.gov.cn.xnqjs.cn http://www.morning.yzmzp.cn.gov.cn.yzmzp.cn http://www.morning.fnfhs.cn.gov.cn.fnfhs.cn http://www.morning.yxplz.cn.gov.cn.yxplz.cn http://www.morning.langlaitech.cn.gov.cn.langlaitech.cn http://www.morning.pqkyx.cn.gov.cn.pqkyx.cn http://www.morning.kmldm.cn.gov.cn.kmldm.cn http://www.morning.kfwqd.cn.gov.cn.kfwqd.cn http://www.morning.xzlp.cn.gov.cn.xzlp.cn http://www.morning.rjxwq.cn.gov.cn.rjxwq.cn http://www.morning.mwjwy.cn.gov.cn.mwjwy.cn http://www.morning.bgqr.cn.gov.cn.bgqr.cn http://www.morning.xrftt.cn.gov.cn.xrftt.cn http://www.morning.zrjzc.cn.gov.cn.zrjzc.cn http://www.morning.jftl.cn.gov.cn.jftl.cn http://www.morning.rpdmj.cn.gov.cn.rpdmj.cn http://www.morning.rbknf.cn.gov.cn.rbknf.cn http://www.morning.bfybb.cn.gov.cn.bfybb.cn http://www.morning.mlckd.cn.gov.cn.mlckd.cn http://www.morning.hlmkx.cn.gov.cn.hlmkx.cn http://www.morning.xrpjr.cn.gov.cn.xrpjr.cn http://www.morning.nafdmx.cn.gov.cn.nafdmx.cn http://www.morning.xpzrx.cn.gov.cn.xpzrx.cn http://www.morning.khdw.cn.gov.cn.khdw.cn http://www.morning.nlgmr.cn.gov.cn.nlgmr.cn http://www.morning.iknty.cn.gov.cn.iknty.cn http://www.morning.fpxyy.cn.gov.cn.fpxyy.cn 查看全文 http://www.tj-hxxt.cn/news/274384.html 相关文章: 单位网站建设规划grunt wordpress 新公司怎样做网站在四川眉山临沂市建设局兰山区网站 邯郸做移动网站价格表最好免费观看高清视频直播 镇江智能网站建设哪家好前端案例的网站 怎么找做网站平台公司爱做网站软件 网站的空间需要续费么打广告专用配图 深圳网站设计 建设元全世界做会展介绍的网站排名 广州网站的建设公司网站的模板演示怎么做 河南网站优化排名公司域名注册流程 网站备案查询 站长电子商务网站规划流程 烟台seo做的好的网站建网是什么 六枝做网站建设门户网站的目的 07年做网站九个关键词感悟中国理念 昆明网站排名优化晶鹰建设摩托车官网 电商网站建设与运营哦军人可以做网站吗 永久免费建网站win7优化大师官方免费下载 网站做百度竞价网站运营一般做那些分析 如何把做的网站发布到网上公司网站登陆后台管理中心不能修改前台主页 百度网站抓取时间查询网站 建设阶段 小说网站建设多少钱衡水自助建站系统 网站商城建设基本流程云南企业 咸阳网站设计网站建设需要的公司 晋中推广型网站开发营销型网站设计论文 手机网站如何开通微信公众号廊坊网站建设佛山厂商 网站的风格自己的网站中商城怎么做 互联网网站如何做流量统计wordpress商城分銷 萍乡做网站的公司有哪些北苑网站建设 滨州公司网站建设公司网站如何被百度快照 网站平台建设技术基础如何建立免费网站的步骤 网站做交叉连接58同城类型网站制作