- 浏览: 2609372 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (880)
- 每日总结 (26)
- java (37)
- lucene 2.4源码学习 (11)
- 庖丁分词的源码分析 (5)
- cindy源码阅读 (10)
- jetty (3)
- java基础 (49)
- hadoop (37)
- python (7)
- 那些蛋疼的事 (15)
- 测试 (5)
- spring (3)
- redis (4)
- git (4)
- 我的开源项目 (2)
- linux (15)
- mysql (8)
- bootsharp (1)
- idea (1)
- Disruptor源码分析 (11)
- 高并发 (22)
- jdk (4)
- 领域驱动 (1)
- 坑 (6)
- 表达式框架 (7)
- 游戏 (3)
- Guava (1)
- 缓存 (1)
- 数据库 (1)
- 游戏项目 (3)
- java8 (1)
最新评论
-
hsluoyz:
PyCasbin是一个用Python语言打造的轻量级开源访问控 ...
权限管理的一个简单后台 -
liuyachao111:
谢谢 问题解决了
对实体 "characterEncoding" 的引用必须以 ';' 分隔符结尾 -
jnjeC:
多谢博主分享,在配置文件里的&也要改成& ...
对实体 "characterEncoding" 的引用必须以 ';' 分隔符结尾 -
大维啊:
同志,你这不行啊!
java 的 AccessController.doPrivileged使用 -
lisha2009:
解决了我的问题,多谢博主分享!
对实体 "characterEncoding" 的引用必须以 ';' 分隔符结尾
Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。
Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
下面是个例子:恢复注释的任何一处都可以实现同步,就是让程序停下来
当然最容易理解的是用同步的方法:
lz的例子的确是Volatile的使用场景,却不直观。因为区别只有一瞬间,当stopRequested修改了后,不用 Volatile可能多执行3遍,别的线程才能发现。但是用了,可能一遍都不多执行,别的线程就能发现。用lz的例子不明显,换成淘宝的秒杀就明显了吧。
你上网查下,Volatile是肯定会被发现的,但是不用Volatile肯定不会发现,这个不存在概率问题的。而且我确实执行了多次验证的。
淘宝的秒杀是怎么样的?
用Volatile是肯定会被发现,不用Volatile不一定不会被发现,你也测出来了,其实跟jre的策略有关。
lz的例子的确是Volatile的使用场景,却不直观。因为区别只有一瞬间,当stopRequested修改了后,不用 Volatile可能多执行3遍,别的线程才能发现。但是用了,可能一遍都不多执行,别的线程就能发现。用lz的例子不明显,换成淘宝的秒杀就明显了吧。
你上网查下,Volatile是肯定会被发现的,但是不用Volatile肯定不会发现,这个不存在概率问题的。而且我确实执行了多次验证的。
淘宝的秒杀是怎么样的?
当然是可以停下来啦。java的变量几乎都不具有原子性,即不同的thread对于共享变量的读写,通常无法及时的反应给其他线程。为了获得更快的速度。
用Volatile可以保证变量可以在其他线程写入的瞬间读到最新值,避免脏读。
lz的例子的确是Volatile的使用场景,却不直观。因为区别只有一瞬间,当stopRequested修改了后,不用 Volatile可能多执行3遍,别的线程才能发现。但是用了,可能一遍都不多执行,别的线程就能发现。用lz的例子不明显,换成淘宝的秒杀就明显了吧。
你以服务器模式运行该程序就可以达到预期结果。 java -version AppName
打错了,是 -server
你以服务器模式运行该程序就可以达到预期结果。 java -version AppName
不是吧,我的是64位的 jdk5,CPU:i3.难道和jdk有关系?我再试下
停下来时肯定会的,只是时机不同而已。没有volatile那停下来就不是准确的时机。
不是吧,我的是64位的 jdk5,CPU:i3.难道和jdk有关系?我再试下
Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
下面是个例子:恢复注释的任何一处都可以实现同步,就是让程序停下来
import java.util.concurrent.TimeUnit; // Broken! - How long would you expect this program to run ? public class StopThread { // private static volatile boolean stopRequested; // value: false private static boolean stopRequested; // value: false public static void main(String... args) throws InterruptedException { Thread backgroundThread = new Thread(new Runnable() { public synchronized void test () { } @Override public void run() { int i = 0; while(!stopRequested){ // test(); i++; } } }); backgroundThread.start(); TimeUnit.SECONDS.sleep(1); stopRequested = true; } }
当然最容易理解的是用同步的方法:
import java.util.concurrent.TimeUnit; // Broken! - How long would you expect this program to run ? public class StopThread { private static boolean stopRequested; // value: false public static synchronized void requestStop() { stopRequested = true; } public static synchronized boolean stopRequested() { return stopRequested; } public static void main(String... args) throws InterruptedException { Thread backgroundThread = new Thread(new Runnable() { @Override public void run() { int i = 0; while(!stopRequested()) i++; } }); backgroundThread.start(); TimeUnit.SECONDS.sleep(1); requestStop(); } }
评论
9 楼
rainsilence
2013-02-22
huangyunbin 写道
rainsilence 写道
lz的例子的确是Volatile的使用场景,却不直观。因为区别只有一瞬间,当stopRequested修改了后,不用 Volatile可能多执行3遍,别的线程才能发现。但是用了,可能一遍都不多执行,别的线程就能发现。用lz的例子不明显,换成淘宝的秒杀就明显了吧。
你上网查下,Volatile是肯定会被发现的,但是不用Volatile肯定不会发现,这个不存在概率问题的。而且我确实执行了多次验证的。
淘宝的秒杀是怎么样的?
用Volatile是肯定会被发现,不用Volatile不一定不会被发现,你也测出来了,其实跟jre的策略有关。
8 楼
huangyunbin
2013-02-22
rainsilence 写道
lz的例子的确是Volatile的使用场景,却不直观。因为区别只有一瞬间,当stopRequested修改了后,不用 Volatile可能多执行3遍,别的线程才能发现。但是用了,可能一遍都不多执行,别的线程就能发现。用lz的例子不明显,换成淘宝的秒杀就明显了吧。
你上网查下,Volatile是肯定会被发现的,但是不用Volatile肯定不会发现,这个不存在概率问题的。而且我确实执行了多次验证的。
淘宝的秒杀是怎么样的?
7 楼
huangyunbin
2013-02-22
我得到的结果是:只有jre6默认情况(client模式)是会停下来的。其他情况(如jre6的server模式 以及jre7)都是不会停的.
6 楼
rainsilence
2013-02-21
lovexp2010 写道
第一个例子,你意思不恢复注释,这个程序就停止不了?我试了,不恢复注释,运行正常,可以停下来,怎么解释?
我的环境:CPU:i5, JDK:1.6
我的环境:CPU:i5, JDK:1.6
当然是可以停下来啦。java的变量几乎都不具有原子性,即不同的thread对于共享变量的读写,通常无法及时的反应给其他线程。为了获得更快的速度。
用Volatile可以保证变量可以在其他线程写入的瞬间读到最新值,避免脏读。
lz的例子的确是Volatile的使用场景,却不直观。因为区别只有一瞬间,当stopRequested修改了后,不用 Volatile可能多执行3遍,别的线程才能发现。但是用了,可能一遍都不多执行,别的线程就能发现。用lz的例子不明显,换成淘宝的秒杀就明显了吧。
5 楼
zjuttsw
2013-02-21
zjuttsw 写道
lovexp2010 写道
第一个例子,你意思不恢复注释,这个程序就停止不了?我试了,不恢复注释,运行正常,可以停下来,怎么解释?
我的环境:CPU:i5, JDK:1.6
我的环境:CPU:i5, JDK:1.6
你以服务器模式运行该程序就可以达到预期结果。 java -version AppName
打错了,是 -server
4 楼
zjuttsw
2013-02-21
lovexp2010 写道
第一个例子,你意思不恢复注释,这个程序就停止不了?我试了,不恢复注释,运行正常,可以停下来,怎么解释?
我的环境:CPU:i5, JDK:1.6
我的环境:CPU:i5, JDK:1.6
你以服务器模式运行该程序就可以达到预期结果。 java -version AppName
3 楼
xiajun_868
2013-02-21
huangyunbin 写道
lovexp2010 写道
第一个例子,你意思不恢复注释,这个程序就停止不了?我试了,不恢复注释,运行正常,可以停下来,怎么解释?
我的环境:CPU:i5, JDK:1.6
我的环境:CPU:i5, JDK:1.6
不是吧,我的是64位的 jdk5,CPU:i3.难道和jdk有关系?我再试下
停下来时肯定会的,只是时机不同而已。没有volatile那停下来就不是准确的时机。
2 楼
huangyunbin
2013-02-21
lovexp2010 写道
第一个例子,你意思不恢复注释,这个程序就停止不了?我试了,不恢复注释,运行正常,可以停下来,怎么解释?
我的环境:CPU:i5, JDK:1.6
我的环境:CPU:i5, JDK:1.6
不是吧,我的是64位的 jdk5,CPU:i3.难道和jdk有关系?我再试下
1 楼
lovexp2010
2013-02-21
第一个例子,你意思不恢复注释,这个程序就停止不了?我试了,不恢复注释,运行正常,可以停下来,怎么解释?
我的环境:CPU:i5, JDK:1.6
我的环境:CPU:i5, JDK:1.6
发表评论
-
超级简单的获取url内容的代码
2016-09-09 16:33 1564只是需要一行代码: String result = new S ... -
java的int和byte数组的相互转换
2015-01-15 16:31 2913byte数组转为int 有两种原理, 一种是先左移动24位,在 ... -
@RequestBody注解时 HttpClient 发送post的例子
2015-01-12 10:33 6758主要是这句: post.setRequestEntity(ne ... -
mvel表达式遇到的坑2 这个更坑
2015-01-09 17:53 6737之前写的一篇文章说的mvel遇到的坑 解决办法是*1.0,这次 ... -
利用javassist获取java的方法参数名
2014-03-22 20:53 6364import java.lang.reflect.Meth ... -
java利用linq4j实现linq
2014-01-13 20:58 10503public class Person implement ... -
访问类本身的私有变量,很不理解的地方
2013-09-30 17:50 1638网上看到这个文章,表示没理解.http://my.oschin ... -
java的DirectBuffer源码分析(主要是DirectBuffer的资源分配和回收)
2013-04-16 17:22 7426可以看到淘宝的一个说明:http://www.tbdata.o ... -
设置log4j的配置文件(里面有不少坑)
2013-04-12 15:59 2009log4j的默认配置文件是log4j.properties,加 ... -
庖丁分词的源码分析
2013-04-08 17:50 3108在网上也看到了不少庖 ... -
eclipse代码行数统计插件
2013-04-08 16:14 6024觉得不错的一个插件,把附件里的压缩文件,解压,放在eclips ... -
关于eclipse 找不到pom文件中的jar包的问题
2013-04-08 15:59 2261我从网上下载呢一个maven的项目,install也成功了,却 ... -
分享视频网站的内容时 缩略图的生成
2013-02-03 09:32 1918分享视频网站的内容时 ,一般都有缩略图的生成,之前没怎么关心, ... -
Runtime.getRuntime().exec 杀人放火利器啊
2013-01-05 16:49 2260public static void main(String[ ... -
split的正则表达式
2012-12-24 14:44 1514我们很经常做得一个事情,一句话,按空格来切分 String s ... -
解决eclipse控制台中文乱码的问题
2012-12-20 14:48 3127二、配置java应用程序的控制台输出。 1.Run ... -
eclipse 重新关联源代码
2012-12-17 09:16 1681eclipse 重新关联源代码 可以右键工程属性 -- pr ... -
maven私服的400和401错误
2012-12-03 17:33 2803400错误是因为没有打开访问,改为下图这样 401错误是没 ... -
SQL_NO_CACHE不起作用,郁闷
2012-12-03 14:53 1770mysql设置了查询缓存,但是第二次的时候就是0秒了,用SQL ... -
ie下onblur和focus自身引起的浏览器卡死,求解释
2012-12-01 17:12 3002代码 <!DOCTYPE HTML PUBLIC &q ...
相关推荐
volatile 变量可用于提供线程安全,但是只能应用于非常有限的一组用例:多个变量之间或者某个变量的当前值与修改后值之间没有约束。 正确使用 volatile 变量的条件是:对变量的写操作不依赖于当前值,以及该变量...
3. 多线程同步与通信: 在多线程环境下,可能会出现数据竞争问题,为了解决这个问题,Java提供了多种同步机制,如synchronized关键字、wait/notify机制、Lock锁(ReentrantLock)等。synchronized用于控制对共享...
Java多线程是Java编程语言中一个非常重要的概念,它允许开发者在一个程序中创建多个执行线程并行运行,以提高程序的执行效率和响应速度。在Java中,线程的生命周期包含五个基本状态,分别是新建状态(New)、就绪...
Java多线程是Java编程中的重要概念,尤其在如今的多核处理器环境下,理解并熟练掌握多线程技术对于提高程序性能和响应速度至关重要。本资料详细讲解了Java多线程的原理,并提供了丰富的实战代码,非常适合Java初学者...
- volatile:修饰变量,确保多线程环境下的可见性和有序性,但不保证原子性。在实例中,可能用于共享标志的设置与读取。 - wait()、notify()和notifyAll():这些方法存在于Object类中,用于线程间的通信。在线程A...
在本项目"基于Java Swing的多线程电梯调度模拟"中,我们主要探讨的是如何利用Java的多线程特性来实现一个复杂的系统——电梯调度。这个任务是在操作系统课程中的一个典型作业,它要求开发者模拟真实世界中的电梯运行...
Java中的单线程和多线程是编程中的关键概念,特别是在服务器端开发中。了解它们的原理和应用对于构建高效、可扩展的客户端-服务器应用至关重要。以下是对这些概念的详细解析。 首先,我们来谈谈单线程。在Java中,...
Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过继承Thread类或实现Runnable接口来实现。本教程《Java多线程编程核心技术》将...
首先,多线程的核心概念包括线程的创建与启动。在Java中,可以通过实现Runnable接口或继承Thread类来创建线程。创建后,调用start()方法启动线程,而非run()方法,因为start()会触发Java虚拟机(JVM)执行线程的run...
本指南将通过实例分析和实践演练,让你深入理解多线程的原理与应用。 首先,我们要了解Java中的线程模型。Java通过Thread类来表示线程,每个线程都有自己的程序计数器、虚拟机栈、本地方法栈和堆。线程的创建可以...
2. volatile关键字:保证了变量在多线程环境下的可见性和有序性,但不保证原子性。 3. Lock接口与ReentrantLock类:提供了比synchronized更细粒度的锁控制,具有可重入性、公平性等特点,可以配合Condition进行条件...
2. `volatile`关键字:确保多线程环境下的可见性和有序性,但不保证原子性。 3. `Lock`接口及其实现类:如`ReentrantLock`,提供更灵活的锁操作,支持公平锁、非公平锁、可重入锁和定时锁等。 4. `Atomic`类:提供...
在本项目“Java多线程与线程安全实践-基于Http协议的断点续传”中,我们将深入探讨如何利用Java的多线程机制实现HTTP协议下的断点续传功能,这对于大文件下载或上传的场景尤为实用。 断点续传是一种允许用户在中断...
本实验"java多线程之赛马程序实验8多线程练习下载进度"聚焦于如何利用多线程来模拟实际场景中的下载进度显示。在这一过程中,我们将探讨Thread类的`run`和`start`方法,以及如何通过进度条来可视化表示下载过程。 ...
- **同步机制**:包括`synchronized`关键字、`volatile`关键字、`Lock`接口及其子类,用于解决多线程环境中的数据一致性问题。 2. **并发控制** - **互斥与同步**:通过`synchronized`关键字实现临界区的互斥访问...
在Java编程中,多线程是一项关键特性,它允许程序同时执行多个任务,极大地提高了效率。本实例将探讨如何利用Java实现一个具有进度条显示功能的多线程应用。进度条通常用于可视化地表示某个任务的完成程度,这对于长...
Java提供了多种同步机制来解决多线程环境下的数据安全问题,如synchronized关键字、 volatile变量、Lock接口(如ReentrantLock)以及Semaphore信号量等。synchronized提供了内置锁,可以保证同一时刻只有一个线程...
3. 多线程中的死锁与活锁 在多线程环境下,死锁是指两个或多个线程相互等待对方释放资源,导致它们都无法继续执行。活锁则是指线程不断重试获取资源,但由于其他线程持有资源不释放,导致线程陷入无限循环的状态。...
Java多线程小游戏是学习Java并发编程的一个经典实践案例,它可以帮助开发者深入理解线程的创建、同步、通信以及管理。在这个课程设计或毕业设计项目中,学生通常会被要求实现一个能够展示多线程特性的游戏,比如经典...
3. 线程同步:Java提供了多种同步机制,如synchronized关键字、volatile变量、Lock接口(ReentrantLock等)、Semaphore信号量、CyclicBarrier屏障等,用于解决多线程环境下资源竞争和数据一致性问题。 二、不可变...