synchronized volatile 关键字

一 synchronized关键字
ynchronized关键字,顾名思义表达的是同步的意思。也就是说,被synchronized关键字修饰的方法、语句块同一时刻只能有一个线程进入。每一个JAVA对象,其都对应一个Monitor(监视器)。
1 使用方式
a修饰非静态方法
b修饰静态方法
c修饰语句块
修饰非静态方法的方式保证同一个对象(注意与静态方法进行区分)的这个方法内部同一时刻仅有一个线程可以进入;相对应的,修饰静态方法的方式保证的是同一个类(注意不再是类的对象了,因为是静态方法)的这个方法内部同一时刻仅有一个线程可以进入。修饰语句块的方式与修饰非静态方法的方式类似
2局限性
a易死锁;
b无法设置尝试获取锁的超时时间,一旦synchronized语句块中需要进行耗时的操作时,同时等待的线程的任务完成时间不可控且不可预期。
3此关键字涉及到一些锁的知识
a java的内置锁:每个java对象都可以用做一个实现同步的锁,这些锁成为内置锁。线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块或方法时会释放该锁。获得内置锁的唯一途径就是进入这个锁的保护的同步代码块或方法。
b java内置锁是一个互斥锁,这就是意味着最多只有一个线程能够获得该锁,当线程A尝试去获得线程B持有的内置锁时,线程A必须等待或者阻塞,知道线程B释放这个锁,如果B线程不释放这个锁,那么A线程将永远等待下去。
c synchronized只是一个内置锁的加锁机制,当某个方法加上synchronized关键字后,就表明要获得该内置锁才能执行,并不能阻止其他线程访问不需要获得该内置锁的方法。
4 synchronized缺陷
当某个线程进入同步方法获得对象锁,那么其他线程访问这里对象的同步方法时,必须等待或者阻塞,这对高并发的系统是致命的,这很容易导致系统的崩溃。如果某个线程在同步方法里面发生了死循环,那么它就永远不会释放这个对象锁,那么其他线程就要永远的等待。这是一个致命的问题。
二 volatile 关键字
Java 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量,相比于synchronized(synchronized通常称为重量级锁),volatile更轻量级,因为它不会引起线程上下文的切换和调度。但是volatile 变量的同步性较差(有时它更简单并且开销更低),而且其使用也更容易出错。
1 并发编程的3个基本概念
a原子性(定义: 即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。)
b.可见性(定义:指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。)
c.有序性 (定义:即程序执行的顺序按照代码的先后顺序执行。)
2 volatile变量的特性
a保证可见性,不保证原子性
(1)当写一个volatile变量时,JMM会把该线程本地内存中的变量强制刷新到主内存中去;
(2)这个写会操作会导致其他线程中的volatile变量缓存无效。
b.禁止指令重排
重排序是指编译器和处理器为了优化程序性能而对指令序列进行排序的一种手段。重排序需要遵守一定规则:
(1)重排序操作不会对存在数据依赖关系的操作进行重排序。
  比如:a=1;b=a; 这个指令序列,由于第二个操作依赖于第一个操作,所以在编译时和处理器运行时这两个操作不会被重排序。
(2)重排序是为了优化性能,但是不管怎么重排序,单线程下程序的执行结果不能被改变
3 volatile不适用的场景
a.volatile不适合复合操作
解决办法:采用synchronized 采用Lock 采用java并发包中的原子操作类,原子操作类是通过CAS循环的方式来保证其原子性的
4 volatile原理
volatile可以保证线程可见性且提供了一定的有序性,但是无法保证原子性。在JVM底层volatile是采用“内存屏障”来实现的。观察加入volatile关键字和没有加入volatile关键字时所生成的汇编代码发现,加入volatile关键字时,会多出一个lock前缀指令,lock前缀指令实际上相当于一个内存屏障(也成内存栅栏),内存屏障会提供3个功能:
(1)它确保指令重排序时不会把其后面的指令排到内存屏障之前的位置,也不会把前面的指令排到内存屏障的后面;即在执行到内存屏障这句指令时,在它前面的操作已经全部完成;
(2)它会强制将对缓存的修改操作立即写入主存;
(3)如果是写操作,它会导致其他CPU中对应的缓存行无效。
5为何不能保证原子性
例如:有两个A,B线程,A先读取volatile变量,在A写之前B又读取了volatile变量;然后A,B各自对变量进行计算,计算结束如果A先写回,此时会刷新B的私有内存和主内存,但是B已经在计算中或者计算完毕,所以新值就对B无效。。。。所以不能保证原子性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值