在并发编程中,多线程同时并发访问的资源叫做临界资源,当多个线程同时访问对象并要求操作相同资源时,分割了原子操作就有可能出现数据的不一致或数据不完整的情况,为避免这种情况的发生,我们会采取同步机制,以确保在某一时刻,方法内只允许有一个线程。采用synchronized修饰符实现的同步机制叫做互斥锁机制,它所获得的锁叫做互斥锁。每个对象都有一个monitor(锁标记),当线程拥有这个锁标记时才能访问这
分类:
编程语言 时间:
2018-11-08 22:11:53
阅读次数:
207
转自于:https://zhuanlan.zhihu.com/p/39322967 1、JAVA中能创建volatile数组吗?volatile能使得一个非原子操作变成原子操作吗? 回答: 能,Java 中可以创建 volatile 类型数组,不过只是一个指向数组的引用,而不是整个数组。Java 中 ...
分类:
编程语言 时间:
2018-11-05 11:28:09
阅读次数:
173
Redis简介 Redis安装 Redis配置 Redis数据类型 Redis功能 Redis性能 Redis部署 Redis应用场景 Redis总结 Redis简介: Redis是一款开源的、高性能的键-值存储(key-value store)。它常被称作是一款数据结构服务器(data struc ...
分类:
其他好文 时间:
2018-10-16 16:03:16
阅读次数:
133
章节介绍 这一章节主要学习java并发机制的底层实现原理。主要学习volatile、synchronized和原子操作的实现原理。Java中的大部分容器和框架都依赖于此。 Java代码 ==经过编译==》Java字节码 ==通过类加载器==》JVM(jvm执行字节码)==转化为汇编指令==》CPU上 ...
分类:
编程语言 时间:
2018-10-14 01:56:11
阅读次数:
197
1. 什么是线程?2. 什么是线程安全和线程不安全?3. 什么是自旋锁?4. 什么是Java内存模型?5. 什么是CAS?6. 什么是乐观锁和悲观锁?7. 什么是AQS?8. 什么是原子操作?在Java Concurrency API中有哪些原子类(atomic classes)?9. 什么是Exe ...
分类:
编程语言 时间:
2018-10-13 10:24:18
阅读次数:
152
Mutex是一把钥匙,一个人拿了就可进入一个房间,出来的时候把钥匙交给队列的第一个。一般的用法是用于串行化对critical section代码的访问,保证这段代码不会被并行的运行。 Semaphore是一件可以容纳N人的房间,如果人不满就可以进去,如果人满了,就要等待有人出来。对于N=1的情况,称 ...
分类:
其他好文 时间:
2018-10-07 18:04:45
阅读次数:
126
定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。 问题由来:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成。这种场景下,类A一般是高层模块,负责复杂的业务逻辑;类B和类C是低层模块,负责基本的原子操作;假如修改类A,会给程序带 ...
分类:
其他好文 时间:
2018-10-05 01:00:34
阅读次数:
160
当程序更新一个变量时,如果多线程同时更新这个变量,可能得到期望之外的值,比如变量i = 1;A线程更新i + 1,B线程也更新i + 1,经过两个线程操作之后可能i不等于3,而是等于2,。因为A和B线程在更新变量i的时候拿到的i都是1,这就是线程不安全的更新操作,通常我们会使用synchronize ...
分类:
编程语言 时间:
2018-10-03 00:43:06
阅读次数:
221
多线程并发访问同一个对象(临界资源),如果不对线程进行同步控制,破坏了原子操作(不可再分的操作),则会造成临界资源(两个线程同时访问的资源)的数据不一致。 每一个对象都有一个互斥的锁标记和一个锁池。当线程拥有这个对象的锁标记时才能访问这个资源,没有锁标记便进入锁池,保证在同步代码块中只有一个线程,解 ...
分类:
编程语言 时间:
2018-10-01 00:15:52
阅读次数:
187
Java 内存模型要求,变量的读操作和写操作都必须是原子操作(最低安全性)。 但是也有例外 ,对于非 volatile 类型的 double 和 long 变量,JVM 允许将 64 位的读操作或写操作分为两个 32 位的操作,因此,多线程中使用共享可变的 long、double 变量是不安全的。 ...
分类:
其他好文 时间:
2018-09-28 20:35:57
阅读次数:
151