Java中的volatile与synchronized

简介

Java中多线程并发编程中synchronized和volatile是对于线程的安全保证的两个重要机制;简单来说synchronized提供了一种独占加锁的机制,使得当前锁住的对象只被一个线程访问;volatile用于保证了线程的在共享内存中变量对于所有线程可见与禁止cpu指令重排作用;从而保证部分状态下的线程安全;
线程安全的三大特性:
原子性:一组语句作为一个不可分割的单元被执行。
可见性:修改一个共享变量时,其他线程可以读到这个修改的值;
有序性:对于多个线程执行来说,他们之间必须是相对有序的;

1、synchonized

synchronized是java中用于提供内置锁的一种加锁机制;其修饰的代码块一般称为:同步代码块。
同门代码块分为两部分:一个作为锁的对象引用,一个作为由这个锁保护的代码块。
这个关键字可以修饰变量、方法或是代码块
对于普通同步方法,锁是当前实例对象。
·对于静态同步方法,锁是当前类的Class对象。
·对于同步方法块,锁是Synchonized括号里配置的对象。

当一个线程试图访问同步代码块时,它首先必须得到锁,退出或抛出异常时必须释放锁。
synchronized加的锁具有可重入的特性;(当某个线程请求一个由其他线程持有的锁时,发出请求的线程就会阻塞。然而,由于内置锁是可重入的,因此如果某个线程试图获得一个已经由它自己持有的锁,那么这个请求就会成功。)

synchronized(lock){

//访问或修改由锁保护的共享状态

}

1.1、执行原理

这些锁是什么?
每个Java对象都可以用做一个实现同步的锁,这些锁被称为内置锁(Intrinsic Lock)或监视器锁(Monitor Lock)。线程在进入同步代码块之前会自动获得锁,并且在退出同步代码块时自动释放锁,而无论是通过正常的控制路径退出,还是通过从代码块中抛出异常退出。获得内置锁的唯一途径就是进入由这个锁保护的同步代码块或方法。

首先代码对象经JVM编译后后加入对象头,而且如果是Synchronized修饰的会加入monit

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值