一、volatile的使用

在Java语言中,多线程编程是可行的,因此与其他语言多线程编程一样也会产生共享问题。当线程占用CPU时,由于编译优化的存在,对于频繁处理的数据一般会将取出后的数据存入寄存器中,并且在寄存器中实时更新,最后才对原数据修改。当并发运行时,如果多个线程占用同一数据块,由于线程运行的不确定性,数据块最后被修改的值将不可控,这是违背安全性原则的。因此,在编程中引入了volatile关键字,被此关键字优化的数据将不再享受编译优化的“福利”,每次存取都必须在数据存储位置并且实时更新,这在一定程度上降低了效率,但是很好的维护了程序的安全性。

二、多线程举例(模拟烧水泡茶


将前面步骤与最后一步泡茶分别创建两个线程对象并发执行。(sleep时间可自行设定不影响结果)

package zz;class Bin{public volatile boolean is_boiled=false;public synchronized void fun1() throws InterruptedException {System.out.println("开始洗茶壶了");try {Thread.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}is_boiled=true;System.out.println("开始烧水了");while(is_boiled==true) {try {notify();this.wait();} catch (InterruptedException e) {e.printStackTrace();}}  try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("开始泡茶了");    try {Thread.sleep(300);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}
}public synchronized void fun2() {while(!is_boiled) {try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("开始洗茶壶了");try {Thread.sleep(300);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("开始洗茶杯了");try {Thread.sleep(300);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("开始拿茶叶了");try {Thread.sleep(300);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}is_boiled=false;notify();}
}class Ready implements Runnable{Bin bi;public Ready(Bin bi){this.bi=bi;}public synchronized void run() {try {bi.fun1();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}
}}
class Boil implements Runnable{Bin bi;public Boil(Bin bi){this.bi=bi;}public synchronized void run() {bi.fun2();}
}public class ThreadRun{public static void main(String[] args) {Bin bi=new Bin();Thread t1=new Thread (new Ready(bi));Thread t2=new Thread (new Boil(bi));t2.start();t1.start();}
}

输出结果:

开始洗茶壶了
开始烧水了
开始洗茶壶了
开始洗茶杯了
开始茶叶了
开始泡茶了

三、习题——生产者消费者
随机生产消费(可能多次生产),无产物时消费线程不执行。

蒟蒻的Java之旅——线程入门相关推荐

  1. 蒟蒻的爬虫之旅(Python版)——robots君子协议(转载)

    一.robots内容介绍 robots是一个网站对可被爬取内容的规范,之所以被戏称为君子协议,就是说这些规范不能做到技术限制,存在通过特殊手段爬取网页限制数据的行为,但很大程度上可能会因为爬取这些网站 ...

  2. Java高并发编程详解系列-Java线程入门

    根据自己学的知识加上从各个网站上收集的资料分享一下关于java高并发编程的知识点.对于代码示例会以Maven工程的形式分享到个人的GitHub上面.   首先介绍一下这个系列的东西是什么,这个系列自己 ...

  3. 蒟蒻的线段树入门模板笔记

    线段树适合处理那些问题? 线段树是算法竞赛中常用的用来维护 区间信息 的数据结构. 线段树可以在O(logN)的时间复杂度内实现单点修改.区间修改.区间查询(区间求和,求区间最大值,求区间最小值,求区 ...

  4. 蒟蒻的python 学习笔记 ——北京理工大学嵩天mooc(有时间就看就更新,尽量让笔记容易懂,蟹蟹各位大神不吝赐教)

    蒟蒻的python 学习笔记 前言 课一:python语言程序设计 第一周:python 基本语法元素 1.1 程序设计基本方法 1.2 python 环境配置 1.3 实例1:温度转换 1.4 py ...

  5. 记一枚蒟蒻的数模国赛参赛经历

    ycy说:这次比赛我们体验的是人生,我认为没错. --题记 题目发布 9月13日晚8:00,从国赛群里get到了题目.这次的比赛题型一如往常:A题是"高温作业专用服装设计",草草看 ...

  6. 《Java 2D游戏编程入门》—— 1.5 创建一个主动渲染的窗口

    本节书摘来异步社区<Java 2D游戏编程入门>一书中的第1章,第1.5节,作者:[美]Timothy Wright(莱特),更多章节内容可以访问云栖社区"异步社区"公 ...

  7. 如何在java中实现线程_用代码说话:如何在Java中实现线程

    并发编程是Java语言的重要特性之一,"如何在Java中实现线程"是学习并发编程的入门知识,也是Java工程师面试必备的基础知识.本文从线程说起,然后用代码说明如何在Java中实现 ...

  8. JAVA之旅(三十五)——完结篇,终于把JAVA写完了,真感概呐!

    JAVA之旅(三十五)--完结篇,终于把JAVA写完了,真感概呐! 这篇博文只是用来水经验的,写这个系列是因为我自己的java本身也不是特别好,所以重温了一下,但是手比较痒于是就写出了这三十多篇博客了 ...

  9. NOIP 2015 蒟蒻做题记录

    昨天做了noip 2015 的题.因为之前做过几道,最开始做的很快,也都A了.可是子串斗地主运输计划什么的这些没做过的题还是把我恶心的不行QAQ我这个大蒟蒻还是没有A掉..所以说先写一下应该得到的暴力 ...

最新文章

  1. Not injecting HSTS header since it did not match the requestMatcher HSTS设置问题解决
  2. phonegap 性能优化 以及 phonegap + Angularjs + ionic 移动 app 开发介绍
  3. numpy保留小数位数
  4. (转)Django ==== 实战学习篇五 模板系统说明
  5. Golang 之 Base62 编码
  6. P1031 均分纸牌(经典贪心)
  7. 数字语音信号处理学习笔记——语音信号的同态处理(1)
  8. 在python中requests模块怎么安装_Python requests模块在Windows下安装
  9. 9.Tornado下的一个简易Blog--2013-05-21
  10. 一致性哈希算法 应用
  11. 【C语言进阶深度学习记录】三 浮点数(float) 在内存中的表示方法
  12. 《梦断代码》读后感 - 驱动,责任,交流,远虑
  13. jpa findone怎么用_Jpa VS MyBatis,你用哪个?
  14. 8个球放入3个盒子方式_颜值与美味并存~分享几款私房盒子蛋糕做法,再也不用排队买了...
  15. 接收请求参数及数据回显 2021-04-26
  16. ESP32 TIMER
  17. oracle数据库出错0095,一种ORACLE数据库优化配置的方法及系统专利_专利查询 - 天眼查...
  18. 贝叶斯思维 统计建模的Python学习法
  19. 怎么克隆计算机的mac,MAC地址克隆方法
  20. cannot import name ‘gcd’ from ‘fractions’

热门文章

  1. 《C语言程序设计》第4版 何钦铭、颜晖主编 课后习题答案 第8章 习题8
  2. 海运到美国整柜多少钱?
  3. 2023年4月份中旬自学考试总结
  4. 机房收费系统(1)-注册控件
  5. (翻译)辨认比回想重要(Recognition over recall)
  6. css元素定位:通过元素的标签或者元素的id、class属性定位
  7. 计算机控制HMI,工控自动化应用方案:简单HMI系统
  8. linux给磁盘分区与格式化
  9. postgresql nextval 使用
  10. 瑞雪时晴,不亦快哉 ——图灵十一月月刊