Java并发编程从入门到精通 之 第三章 Thread安全

3人阅读 评论(0) 收藏 举报
分类:
初识Java内存模型与多线程:
-1 认识 
CPU计算时,读取顺序是 寄存器->高速缓存区->内存,频繁读取的话可能会存在寄存器和告诉缓存区,并在适当时候写回内存。
-2 线程会共享java堆内存(主内存),操作变量时,会把变量从主内存你拷到工作内存操作,然后刷新到主内存。


线程不安全:
-1 原因:多个线程同时操作一个数据会造成相互修改问题。
-2 解决方法(三种);
-- 多实例(不用单利)、使用java.util.concurrent类库、锁(lock、synchronized。。。)


隐式锁,又称线程同步synchronized:
-1 修饰位置:
//1. 方法
public synchronized void synMethod() {}
//2. 代码块
synchronized(this) {}
-2 优化:降低加锁的资源
private byte[] lock = new byte[1];
public void method(){
    synchronized(lock) {}
}


显示锁Lock和ReentrantLock:
-1 加锁最高频率实现:
class X {
    private final ReentrantLock lock = new ReentrantLock();
    
        public void m(){
            lock.lock();  //加锁。。
            try{   } finally{
                lock.unlock();//解锁。。。
            }
        }
}



显示锁ReadWriteLock和ReentrantReadWriteLock:
-1 相比上面优势:可被多个读线程访问,或被一个写线程访问。
-2 使用场景:适合共享资源被大量读取,少量写操作。
-3 使用:
private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
//抽取读锁和写锁
private Lock readLock = rwl.readLock();
private Lock writeLock = rwl.writeLock();
//对所有访问者加读锁
public double getTotalBalance() {
    readLock.lock();
    try{。。。}
    finally{ readLock.unlock();  }
}
//对所有修改者加写锁
public double transfer() {
   writeLock .lock();
    try{。。。}
    finally{        writeLock.unlock();  }
}



显示锁StampedLock:
-1 锁的概念:
悲观锁:并发冲突下,屏蔽一切违反数据完整性操作。
读取悲观锁:读取前,判断数据是否被修改中。在·
乐观锁:假设不冲突,只在提交时检查数据是否违反数据完整性。
读取乐观锁:读取前不需判断一致性,只读自己就好。

-2 stampedLock介绍:
jdk1.8推出的api,可提高读取所吞吐量,乐观读取锁极大提高。
该锁易误用,建议使用ReentrantLock和ReentrantReadWriteLock即可。


Java关键字volatile修饰变量:
-1 说明:
volatile是易变不稳定的,不能对其采用缓存机制,因为它每次都从内存读取。但改完volatile后不一定会立刻将其写回你内存,所以做高并发不可靠。
-2 应用场景:
一线程修改,多线程读取,对内存可见性极高,原子性低。而加锁既能确保可见又能确保原子。


原子操作:atomic:
-1 说明:
是java.util.concurrent.atomic里,包含基本类AtomicInteger,AtomicLong,AtomicBoolean和 引用类型AtomicReference。。 和数组类型AtomicXxxArray。。和属性原子修改器,是线程安全的volatile(具备原子性)
-2 使用示例:
AtomicInteger ai = new AtomicInteger(0);
ai.get();   //获得
ai.getAndSet(5); //获得并修改
ai.getAndIncreament();  //获得并加1
ai.getAndDecreament();   //获得并减1
ai.getAndAdd(10);        //获得并加10           
-3 原理:利用CPU比较交换和非阻塞算法。













查看评论

Java并发编程从入门到精通

  • 2017年07月19日 11:11
  • 31.53MB
  • 下载

Java并发编程从入门到精通.张振华(带详细书签)

  • 2017年12月13日 23:22
  • 93.43MB
  • 下载

Java并发编程从入门到精通 张振华.Jack --我的书

本书作者结合自已10多年Java并发编程经验,详细介绍了Java并发编程的基础概念、工作原理、编程技巧和注意事项,对Java高性能高并发编程有极大的参考价值。 本书内容包括并发编程概念,线程,线程安全...
  • tianya846
  • tianya846
  • 2015-07-26 22:46:29
  • 4455

《Java并发编程从入门到精通》目录

http://product.dangdang.com/23751808.html 第一部分:线程并发基础 第1章  概念部分 1.1  CPU核心数、线程数 1.2  CPU时间片轮转机...
  • brucexia
  • brucexia
  • 2015-11-05 17:43:57
  • 1403

java并发编程从入门到精通

  • 2018年03月26日 20:41
  • 93.38MB
  • 下载

java 并发编程从入门到精通.pdf

  • 2018年03月14日 15:54
  • 93.41MB
  • 下载

2016书单总结--Java并发编程实战--安全性-活跃性示例

2016书单总结–Java并发编程实战–安全性-活跃性示例Java的内存模型支持一次编写,随处运行 每个线程拥有自己的虚拟机栈、局部变量、程序计数器,共享进程中堆上的共享变量,共享方法区(永久内存区...
  • undergrowth
  • undergrowth
  • 2017-01-11 23:23:30
  • 615

Visual C#从入门到精通.第8版.John Sharp.part2.rar (中文扫描完整版第二部分)

  • 2017年08月10日 16:39
  • 39.62MB
  • 下载

JAVA从入门到精通(实例版)完整.pdf版

  • 2017年08月29日 14:08
  • 23.2MB
  • 下载

java并发编程(一)-从入门到吐血

一:初始原子类 在并发编程中,若多个线程同时操作同一变量就有问题了,比如:...
  • qq_34759158
  • qq_34759158
  • 2017-11-15 18:04:15
  • 71
    个人资料
    等级:
    访问量: 25万+
    积分: 3275
    排名: 1万+