线程安全:一个函数被称为线程安全的(thread-safe),当且仅当被多个并发进程反复调用时,它会一直产生正确的结果。如果一个函数不是线程安全的,我们就说它是线程不安全的(thread-unsafe)。我们定义四类(有相交的)线程不安全函数。 第1类:不保护共享变量的函数 将这类线程不安全函数变为... ...
分类:
编程语言 时间:
2016-09-05 21:01:35
阅读次数:
176
volatile该关键字是主要使用的场合是字啊多个线程中可以感知实例的变量被更改了并且可以获取到最新的值进行使用,也就是用多线程读取共享变量的时候可以获取到最新的值使用。不能保障原子性 如果你在jvm中传递-server时候会导致这个运行的栈会在私有内存中而不是在共享内存中。 而synchroniz ...
分类:
编程语言 时间:
2016-09-05 16:55:02
阅读次数:
186
volatile的特性 当我们声明共享变量为volatile后,对这个变量的读/写将会很特别。理解volatile特性的一个好方法是:把对volatile变量的单个读/写,看成是使用同一个监视器锁对这些单个读/写操作做了同步。下面我们通过具体的示例来说明,请看下面的示例代码: 假设有多个线程分别调用 ...
分类:
编程语言 时间:
2016-08-30 07:08:51
阅读次数:
254
一、Java内存模型介绍 内存模型的作用范围: 在Java中,所有实例域、静态域和数组元素存放在堆内存中,线程之间共享,下文称之为“共享变量”。局部变量、方法参数、异常处理器等不会在线程之间共享,不存在内存可见性问题,也不受内存模型的影响。 重排序与可见性: 现代编译器在编译源码时会做一些优化处理, ...
分类:
编程语言 时间:
2016-08-27 00:29:27
阅读次数:
223
在并发编程过程中,我们大部分的焦点都放在如何控制共享变量的访问控制上(代码层面),但是很少人会关注系统硬件及JVM底层相关的影响因素。前段时间学习了一个牛X的高性能异步处理框架 Disruptor,它被誉为“最快的消息框架”,其 LMAX 架构能够在一个线程里每秒处理6百万订单!在讲到 Disrup... ...
分类:
其他好文 时间:
2016-08-23 21:42:20
阅读次数:
200
创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果 转自 :http://www.cnblogs.com/dolphin0520 ...
分类:
编程语言 时间:
2016-08-23 20:22:36
阅读次数:
220
1. 可重入函数 (1)不使用静态变量和全局非const变量 (2)不使用锁 (3)不调用任何不可重入函数 (4)使用volatile防止寄存器缓存变量 See Aslo : CPU的乱序执行,会使得对共享变量的访问变得不可知 2. 线程 用户使用的是用户态线程,Kernel运行的是内核态的线程 O ...
分类:
编程语言 时间:
2016-08-22 12:21:52
阅读次数:
169
最近遇到别人问的一个问题,如下: 高并发下修改商品库存,加锁会导致性能问题,怎样实现在不加锁的情况下实现高性能修改库存?我的答案:1、一般对于并发处理都需要加锁,否则会导致共享变量不可见问题,尽量将锁的力度变小2、如果确认不能或不想加锁,则做串行化处理,我给的解决方案是消息队列3、http://ww... ...
分类:
其他好文 时间:
2016-08-19 19:15:08
阅读次数:
803
1、JMM:Java Memory Model(Java内存模型) 关于synchronized的两条规定: 1、线程解锁前,必须把共享变量的最新值刷新到主内存中 2、线程加锁时,将清空工作内存中共享变量的值,从而使用共享变量时需要从主内存中重新读取最新的值(注意:加锁和解锁需要是同一把锁) 注:线 ...
分类:
编程语言 时间:
2016-08-17 01:36:42
阅读次数:
182
Java语言规范第三版中对volatile的定义如下: Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致性的更新,线程应该确保通过排他锁 单独获得这个变量。 volatile有时候比锁更加方便,比如一个字段被声明成volatile,Java线程内存模型确保所有线程看到这个变量的 ...
分类:
编程语言 时间:
2016-08-09 08:11:39
阅读次数:
318