GithubHelp home page GithubHelp logo

concurrency's People

Contributors

hintheshell avatar

Watchers

 avatar  avatar

concurrency's Issues

6.乐观锁与悲观锁

  1. 为什么需要锁?
    在多用户环境中,在同一时间可能会有多个用户更新相同的记录,这会产生冲突。这就是著名的并发性问题。

2.典型的冲突类型
1.丢失更新: 一个事务的更新覆盖了其它事务的更新结果
用户A把值从6改为2,用户B把值从2改为6,则用户A丢失了他的更新。
2.脏读:当一个事务读取其它完成一半事务的记录时,就会发生脏读取。例如:用户A,B看到的值都是6,用户B把值改为2,用户A读到的值仍为6。

3.并发控制的机制
悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。
乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。 乐观锁不能解决脏读的问题。

  1. 乐观锁和悲观锁
    悲观锁(Pessimistic Lock):悲观,认为每次取数据一定有人会修改,所以每次在拿数据的时候都会上锁,这样子别人要拿就会被block-->直到它拿到锁

乐观锁(Optimistic Lock):乐观,认为每次拿数据的时候别人都不会修改,所以不会上锁,但是在更新的时候做一下简单的判断在此期间有没有人去更新数据,使用版本号等机制。适用于多读的操作。

优缺点:乐观锁吞吐量高 省去了锁的开销,但是如果经常冲突,则一直retry会造成性能损失,这种情况适合悲观锁

5.乐观锁应用
1 版本号
2 时间戳
注:对于以上两种方式,Hibernate自带实现方式:在使用乐观锁的字段前加annotation: @Version, Hibernate在更新时自动校验该字段。

2.线程

线程安全性

当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程如何交替执行,并且不需要任何额外的同步和协同,这个类都能表现出正确的行为,那么这个类是线程安全的。

原子性

提供了互斥访问,同一时刻只能有一个线程来对它进行操作

可见性

一个线程对主内存的修改可以及时的被其他线程观察到

有序性

一个线程观察其他线程中的指令执行顺序,由于指令重排序的存在 ,该观察结果一半杂乱无序

java内存模型

在Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽各个硬件平台和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。
那么Java内存模型定义了程序中变量的访问规则,往大一点说是定义了程序执行的次序。注意,为了获得较好的执行性能,Java内存模型并没有限制执行引擎使用处理器的寄存器或者高速缓存来提升指令执行速度,也没有限制编译器对指令进行重排序。也就是说,在java内存模型中,也会存在缓存一致性问题和指令重排序的问题。

Java内存模型规定所有的变量都是存在主存当中(类似于前面说的物理内存),每个线程都有自己的工作内存(类似于前面的高速缓存)。线程对变量的所有操作都必须在工作内存中进行,而不能直接对主存进行操作。并且每个线程不能访问其他线程的工作内存。

8.HashMap&ConcurrentHashMap

HashMap的默认长度为什么是16?

如果两个元素不相同,但是hash函数的值相同,这两个元素就是一个碰撞
因为把任意长度的字符串变成固定长度的字符串,所以存在一个hash对应多个字符串的情况,所以碰撞必然存在

1.java内存模型 JMM 与 MESI

JMM

java 内存模型是一种规范
比如规定volatile需要保证可见性,在遇到volatile修饰的变量时,由jdk通过在指令里插入内存屏障来保证他每次都可以读到最新的值

MESI

MESI模型是CPU缓存模型

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.