脏读:

脏读指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。总的来说取到的数据是其实是被更改过的,但还没有保存到数据库的数据。

不可重复读:

不可重复读是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另一个事务也访问该同一数据,那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的数据可能是不一样的。这样造成了在同一个事务中两次读到的数据是不一样的,因此称为是不可重复读。即不能读到相同的数据内容。

幻读:

幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好像发生了幻觉一样。

事务隔离的五种级别:

  • TRANSACTION_NONE: 不使用事务
  • TRANSACTION_READ_UNCOMMITTED: 允许脏读
  • TRANSACTION_READ_COMMITTED: 防止脏读(最常用的隔离级别,并且是大多数数据库的默认隔离级别)
  • TRANSACTION_REPEATABLE_READ: 可以防止脏读和不可重复读
  • TRANSACTION_SERIALIZABLE: 可以防止脏读,不可重复读和幻读(事务串行化,降低数据库的效率)

注意: 事务的隔离级别受到数据库的限制,不同的数据库支持的隔离级别不一定相同

synchronized关键字

synchronize修饰的方法

关键字synchronized取得的锁都是对象锁或类锁,而不是把一段代码或方法当作锁,哪个线程先执行带有synchronized关键字的方法,哪个线程就持有该方法所属对象的锁,其他线程只能等待,前提是多个线程访问的是同一个对象。

A线程持有Object对象的锁,B线程可以异步调用Object对象中非synchronized的方法

A线程持有Object对象的锁,B线程如调用Object对象中含有synchronized的方法,则需等待,即同步

当一个线程得到一个对象锁之后,再次请求此对象锁可以再次得到该对象锁,这就是锁重入,在父子类的继承当中,也支持锁重入

当一个线程执行代码发生异常时,锁会被自动释放掉

synchronized修饰的同步代码块

当A线程访问对象的用synchronized修饰的代码块时,B线程可以访问该对象方法中其余非synchronized块的部分

当A线程访问对象的用synchronized修饰的代码块,B线程如果要访问这段synchronized块,将会被阻塞

Java还支持对“任意对象”作为对象监视器来实现同步的功能,这个任意对象大多是实例变量和方法的参数

另外只要对象的引用不变,即使改变了对象的属性,运行结果依然是同步的

synchronized的非this对象的三个结论:

  1. 当多个线程同时执行synchronized(A){ }同步代码块时呈同步效果
  2. 当其他线程执行A对象中的synchronized同步方法时呈同步效果
  3. 当其他线程执行A对象方法中的synchronized(this)代码块时也呈同步效果

synchronized修饰静态方法

synchronized用在静态方法上,则代表的时对当前.Java文件对应的Class类加锁,它和非静态的同步方法持有的锁是不同的,前者是类锁,后者是对象锁

volatile关键字

根据Java内存模型(JMM),Java中有一块主内存,不同的线程有自己的工作内存。同一个变量的值在主内存中有一份,如果线程用到了这个变量,自己的工作内存中也会有一份一模一样的的拷贝。每次进入线程从主内存中拿到变量的值,每次执行完线程将变量从工作内存同步回主内存。

volatile关键字修饰变量,每次读取这个变量时,都先从主内存中把变量同步到线程的工作内存中,该变量为当前时刻最新的变量,当修改变量时,都会把这个变量同步到主线程。从而保证了每次读取到的都是最新的值。这就是volatile的可见性

线程安全围绕的是可见性和原子性这两个特性展开的,volatile解决的是变量在多个线程之间的可见性,但无法保证原子性。用synchronized则既保证了原子性,也保证了可见性。synchronized修饰的方法或代码块,都会先把主存中的数据拷贝到工作内存,同步代码结束,会把工作内存的数据更新到主内存,从而保证了主内存的数据始终使最新的

wait()方法

wait()方法的作用是使当前运行代码的线程进入等待状态,并将其线程放置在“预执行队列中”,并且在wait()方法所在的代码处停止执行,直到接到通知或被中断。在调用wait()方法前,线程必须获得该对象的锁,因此只能在同步方法或同步代码块中调用该方法

notify()方法

notify()方法的作用是当多个线程等待,线程规划器会随机挑选出一个wait的线程,将其唤醒,并使它等待获取该对象的对象锁。等待获取该对象的对象锁意味着即使收到通知,wait的线程也不会马上获取对象锁,必须等待调用notify()方法的线程释放对象锁。notify()方法也只能在同步方法或同步代码块中调用

notifyAll()方法

notifyAll()方法唤醒所有等待状态的线程

总结:

  • wait()方法会使该线程释放共享资源的锁,从而从运行状态进入等待状态,直到被唤醒
  • notify()方法会随机唤醒等待队列中等待共享资源的一个线程,并使该线程从等待状态变为可运行状态,当该线程获取到了该对象锁后,即可运行下去
  • notifyAll()方法会唤醒所有等待队列中等待共享资源的线程,并使这些线程从等待状态变为可运行状态

最后,如果wait(),notify(),notifyAll()这三个方法没有在同步方法或同步代码块中调用,将会抛java.lang.IllegalMonitorStateException

注意: wait()方法释放锁,notify()方法不会释放锁

Java 多线程(二)synchronized和volatile的更多相关文章

  1. Java多线程同步方法Synchronized和volatile

    11 同步方法  synchronized – 同时解决了有序性.可见性问题  volatile – 结果可见性问题 12 同步- synchronized synchronized可以在任意对象上加 ...

  2. Java 多线程之 synchronized 和 volatile 的比較

    概述 在做多线程并发处理时,常常须要对资源进行可见性訪问和相互排斥同步操作.有时候,我们可能从前辈那里得知我们须要对资源进行 volatile 或是 synchronized 关键字修饰处理.但是,我 ...

  3. 【java多线程】synchronized和volatile

    文章目录 一.synchronized 1.synchronized使用的方法 2.注意 3.不要以字符串作为锁的对象 4.`synchronized`锁的是什么? 二.volatile 1.引出问题 ...

  4. java线程安全— synchronized和volatile

    java线程安全— synchronized和volatile package threadsafe; public class TranditionalThreadSynchronized { pu ...

  5. Java多线程-同步:synchronized 和线程通信:生产者消费者模式

    大家伙周末愉快,小乐又来给大家献上技术大餐.上次是说到了Java多线程的创建和状态|乐字节,接下来,我们再来接着说Java多线程-同步:synchronized 和线程通信:生产者消费者模式. 一.同 ...

  6. java 多线程二

    java 多线程一 java 多线程二 java 多线程三 java 多线程四 线程中断: /** * Created by root on 17-9-30. */ public class Test ...

  7. Java多线程编程那些事:volatile解惑--转

    http://www.infoq.com/cn/articles/java-multi-thread-volatile/ 1. 前言 volatile关键字可能是Java开发人员“熟悉而又陌生”的一个 ...

  8. JAVA多线程学习- 三:volatile关键字

    Java的volatile关键字在JDK源码中经常出现,但是对它的认识只是停留在共享变量上,今天来谈谈volatile关键字. volatile,从字面上说是易变的.不稳定的,事实上,也确实如此,这个 ...

  9. Java多线程(二) 多线程的锁机制

    当两条线程同时访问一个类的时候,可能会带来一些问题.并发线程重入可能会带来内存泄漏.程序不可控等等.不管是线程间的通讯还是线程共享数据都需要使用Java的锁机制控制并发代码产生的问题.本篇总结主要著名 ...

  10. Java多线程:synchronized的可重入性

    从Java多线程:线程间通信之volatile与sychronized这篇文章中我们了解了synchronized的基本特性,知道了一旦有一个线程访问某个对象的synchronized修饰的方法或代码 ...

随机推荐

  1. Self-hosting Sentry With Docker and Docker-compose

    If a user encounters an error but you don't know about, did it happen at all? Sentry is one of the s ...

  2. 如何上传SNAPSHOT类型的JAR文件到nexus中

    在要上传的文件的目录中执行以下命令即可: mvn deploy:deploy-file -DgroupId=com.alibaba -DartifactId=dubbo -Dversion=2.5.4 ...

  3. 【图文】Excel中vlookup函数的使用方法

    今天统计数据,用到了Excel中vlookup函数,第一次使用当然少不了百度,经过反复研究后,算是解决了问题,现整理成文档. 一.实现效果 Sheet1 Sheet2   注:上图中sheet1商品条 ...

  4. Solid Angle of A Cubemap Texel - 计算Cubemap的一个像素对应的立体角的大小

    参考[http://www.rorydriscoll.com/2012/01/15/cubemap-texel-solid-angle/] 计算diffuse irradiance map或者求解sh ...

  5. java学习笔记1——继承

    通过在类的声明中加入extends子句创建一个子类并继承父类的成员变量和方法.如: class SubClass extends SuperClass{ ... } 若SuperClass是另一个类的 ...

  6. concurrently - npm 同时运行前端和后台服务

    项目基于vue(前端)+node(后台),需要启动两个服务 0.文件夹结构及package.json内容: 1.客户端 npm run dev 2.服务器 cd server npm run serv ...

  7. 抢滩5G,哪些行业将受最大影响?

    抢滩5G,哪些行业将受最大影响? 中国工信部6月6日已正式向中国电信.中国移动.中国联通.中国广电发放5G商用牌照.中国成为继韩国.美国.瑞士.英国之后,第五个宣布5G商用的国家. 这次颁发牌照,比计 ...

  8. BZOJ 1726: [Usaco2006 Nov]Roadblocks第二短路 Dijkstra

    Description 贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友.贝茜很喜欢路边的风景,不想那么快地结束她的旅途,于是她每次回农场,都会选择第二短的路径,而不象我们所习惯的那样, ...

  9. 了解http协议

    http:超文本传输协议 https:安全超文本传输协议 FTP:文件传输协议 TCP:网络控制协议 IP:互联网协议 UDP:用户数据协议 https协议特点-------------------- ...

  10. Oracle数据库性能优化基础

    1.数据处理分类OLTP,OLAP 2.Oracle特性 3.数据库优化方法论/原则 方法论:自顶向下优化和自底向上优化 3.1 自顶向下优化 3.2 自底向上优化 对于多年的老系统出现性能问题时,就 ...