【Effective Java】11、同步访问共享的可变数据
这段时间看的部分感觉没啥需要记录下来的,个人也没什么想法,不过以后还是要多记,多写
package cn.xf.cp.ch02.item66; import java.util.concurrent.TimeUnit; import org.junit.Test; public class StopThread
{
/**
* 停止线程变量
*/
private static boolean stopRequested; //吧对变量的读和写方法都进行同步
private static synchronized void requestStop()
{
stopRequested = true;
} private static synchronized boolean stopRequested()
{
return stopRequested;
} /**
* 停止线程变量,这个使用关键字volatile使每个线程都是获取到最新的值
*/
private static volatile boolean stopRequested2; @Test
public void test()
{
Thread backgroundThread = new Thread(new Runnable()
{
@Override
public void run()
{
int i = 0;
while(!stopRequested())
{
++i;
}
}
});
//启动线程
backgroundThread.start(); //休眠1秒
try
{
TimeUnit.SECONDS.sleep(1);
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
requestStop();
} @Test
public void test2()
{
Thread backgroundThread = new Thread(new Runnable()
{
@Override
public void run()
{
int i = 0;
System.out.println("这里使用最新的stopRequested2值");
while(!stopRequested2)
{
++i;
}
}
}); //启动线程
backgroundThread.start(); //停下1s之后执行变量修改程序
try
{
TimeUnit.SECONDS.sleep(1);
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
//修改变量
stopRequested2 = true;
} public static void main(String[] args) throws InterruptedException
{
Thread backgroundThread = new Thread(new Runnable()
{
@Override
public void run()
{
int i = 0;
System.out.println(stopRequested); //false
//这里停不下来是因为主线程对stopRequest进行修改的时候,这个线程并不可见
while(!stopRequested)
{
++i;
}
}
});
//启动线程
backgroundThread.start(); //休眠1秒
TimeUnit.SECONDS.sleep(1);
stopRequested = true;
}
}
这个main方法是永远不停的,其余两个从两个不同的角度给出了同步的方法
总之:当多个线程共享可变数据的时候,每个读或者写数据的线程都必须执行同步。
【Effective Java】11、同步访问共享的可变数据的更多相关文章
- Effective Java 第三版——78. 同步访问共享的可变数据
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...
- Effective Java 11 Override clone judiciously
Principles If you override the clone method in a nonfinal class, you should return an object obtaine ...
- Effective.Java第78-90条(同步相关)
78. 同步访问共享的可变数据 为了在线程之间进行可靠的通信,也为了互斥访问,同步是必要的. 不共享可变的数据.要么共享不可变的数据,要么压根不共享.换句话说,将可变数据限制在单线程中. 当多个线程 ...
- Effective Java通俗理解(下)
Effective Java通俗理解(上) 第31条:用实例域代替序数 枚举类型有一个ordinal方法,它范围该常量的序数从0开始,不建议使用这个方法,因为这不能很好地对枚举进行维护,正确应该是利用 ...
- 《Effective Java(中文第二版)》【PDF】下载
<Effective Java(中文第二版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382186 Java(中文第二版)& ...
- Java 高效编程(Effective Java)中文第三版(补档)
来源:sjsdfg/effective-java-3rd-chinese <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过, ...
- 《Effective Java 第三版》目录汇总
经过反复不断的拖延和坚持,所有条目已经翻译完成,供大家分享学习.时间有限,个别地方翻译得比较仓促,希望有疑虑的地方指出批评改正. 第一章简介 忽略 第二章 创建和销毁对象 1. 考虑使用静态工厂方法替 ...
- 《Effective Java》 学习笔记 —— 并发
<Effective Java>第二版学习笔记之并发编程. 第66条 同步访问共享的可变数据 * 关键字synchronized可以保证在同一时刻只有一个线程可以执行某个方法或代码块. * ...
- Effective Java 3rd.Edition 翻译
推荐序 前言 致谢 第一章 引言 第二章 创建和销毁对象 第1项:用静态工厂方法代替构造器 第2项:遇到多个构造器参数时要考虑使用构建器 第3项:用私有构造器或者枚举类型强化Singleton属性 第 ...
随机推荐
- C#学习系列-out与ref的区别
参考:http://www.microsoftvirtualacademy.com/Content/ViewContent.aspx?et=9851&m=9839&ct=31056 如 ...
- 每天一个linux命令(26):用SecureCRT来上传和下载文件
用SSH管理linux服务器时经常需要远程与本地之间交互文件.而直接用SecureCRT自带的上传下载功能无疑是最方便的,SecureCRT下的文件传输协议有ASCII.Xmodem.Zmodem. ...
- jquerymobile仿微信 - 01
jquerymobile仿微信 - 01 jquerymobile的组件感觉不咋地哇 本地调试最好是开一个web server,不然数据访问会有问题 <div data-role="p ...
- 关于BUG率的计算和它的实际意义的思考
我的微信号是Shalayang,以下是我的二维码名片,欢迎添加. 问题1:bug率有什么作用? my opion:用处有很多,需要具体情况具体分析,不过主要作用一般是来评价工作产品的质量.如果bug率 ...
- 快速入门系列--WebAPI--01基础
ASP.NET MVC和WebAPI已经是.NET Web部分的主流,刚开始时两个公用同一个管道,之后为了更加的轻量化(WebAPI是对WCF Restful的轻量化),WebAPI使用了新的管道,因 ...
- CSS3新技能学习笔记
说来惭愧自认为对css了解,但在项目中却很少有正确的使用css,如果面向对象的css吧,其实也不是不想用而是css天生就是面向对象的,高度可重用,但是如果把每个都单独提取,难免会有过多的class以及 ...
- OpenCascade Primitives BRep - Sphere
OpenCascade Primitives BRep - Sphere eryar@163.com Abstract. BRep is short for Boundary Representati ...
- vs xamarin android 监听返回键退出程序
public override bool OnKeyDown([GeneratedEnum]Keycode keyCode, KeyEvent e) { if (keyCode == Keycode. ...
- Floyd算法(三)之 Java详解
前面分别通过C和C++实现了弗洛伊德算法,本文介绍弗洛伊德算法的Java实现. 目录 1. 弗洛伊德算法介绍 2. 弗洛伊德算法图解 3. 弗洛伊德算法的代码说明 4. 弗洛伊德算法的源码 转载请注明 ...
- c#socket同步通信
再次特别感谢张子阳老师的文章,读后深感益处. 废话不多说,先贴代码 这是服务器端代码 using System; using System.Collections.Generic; using Sys ...