并发编程基础与原理

Synchronized(同步锁)

思考一个问题,锁是为了解决什么问题,锁的本质是什么?
  锁的本质是在多线程使用共享资源中,为了解决线程资源抢占提出的一个概念。

锁的使用

public class Test {

    // 修饰静态方法 (类锁)
    static synchronized void test(){
    }

    // 修饰非静态方法 (对象锁)
    synchronized void method(){
        // 临界区
    }

    Object obj = new Object();

    void demo(){
        // 修饰代码块 (对象锁)
        synchronized (obj){
            // 临界区
        }
    }
}

synchronized三种加锁方式

1.修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁。
2.修饰静态方法,作用与当前类对象加锁,进入同步代码前要获得当前类对象的锁。
3.修饰代码块,对给定对象加锁,进入同步代码前要获得给定对象的锁。

锁的升级 偏向锁-> 轻量级锁->重量级锁

对象头

偏向锁

  大多情况下,锁不存在多线程竞争,总由同一个线程多次获取。

  当一个线程访问了加了同步锁的代码块时候,对象头中存储当前的线程ID,后续这个线程进入和退出这段加了锁的代码快时候,不需要再次加锁和释放锁。而是直接比较对象头里面是否存储了指向当前线程的偏向锁。

偏向锁是为了在无多线程竞争的情况尽量减少不必要的轻量级锁执行路径。(偏向锁的目的是消除数据在无竞争的情况下同步,进一步提高程序的运行性能)

轻量级锁

  如果偏向锁被关闭或者当前对象偏向锁已经被其他线程获取了,那么这个时候如果有线程去抢占同步锁,锁会升级为轻量级锁。

重量级锁

  多个线程竞争同一个把锁的时候,虚拟机会阻塞加锁失败的线程,并且在目标锁被释放的时候,唤醒这些线程。
  Java线程的阻塞和唤醒都是依靠操作系统来完成的,os pthread_mutex_lock();
  升级为重量级锁,锁标志的状态值变为“10”,此时Mark Word中存储的是指向重量级锁的指针,此时等待锁的线程都会进入阻塞状态。

总结

  偏向锁只有在第一次请求时采用CAS在锁对象的标记中记录当前线程的地址,在之后该线程再次进 入同步代码块时,不需要抢占锁,直接判断线程ID即可,这种适用于锁会被同一个线程多次抢占的情况。

  轻量级锁才用CAS操作,把锁对象的标记字段替换为一个指针指向当前线程栈帧中的 LockRecord,该工件存储锁对象原本的标记字段,它针对的是多个线程在不同时间段内申请通一把锁的情况。

  重量级锁会阻塞、和唤醒加锁的线程,它适用于多个线程同时竞争同一把锁的情况。

死锁是什么?产生死锁的四个必要条件?

什么是死锁?

  死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。

产生的原因?

  1. 系统资源的竞争。
    系统资源的竞争导致系统资源不足,以及资源分配不当,导致死锁。
  2. 进程运行推进顺序不合适。
    进程在运行过程中,请求和释放资源的顺序不当,会导致死锁。

产生死锁的四个必要条件

  互斥、占有且等待、不可抢占、循环等待。

互斥

  一个资源每次只能被一个进程使用,即在一段时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。


占有且等待

已知拥有资源X,和Y,线程T1,线程T2

  线程T1已经抢占资源X,又想抢占资源Y,但是Y资源已经被线程T2抢占,这时T1线程处于等待Y资源的同时,又不释放资源X。

如何破坏 占有且等待

方法1:所有的进程在开始运行之前,必须一次性地申请其在整个运行过程中所需要的全部资源。
    优点:简单易实施且安全。
    缺点:因为某项资源不满足,进程无法启动,而其他已经满足了的资源也不会得到利用,严重降低了资源的利用率,造成资源浪费。使进程经常发生饥饿现象。

方法2:该方法是对第一种方法的改进,允许进程只获得运行初期需要的资源,便开始运行,在运行过程中逐步释放掉分配到的已经使用完毕的资源,然后再去请求新的资源。这样的话,资源的利用率会得到提高,也会减少进程的饥饿问题。


不可抢占

  进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能 由获得该资源的进程自己来释放(只能是主动释放)。

如何破坏 不可抢占
  当一个已经持有了一些资源的进程在提出新的资源请求没有得到满足时,它必须释放已经保持的所有资源,待以后需要使用的时候再重新申请。


循环等待

已知拥有资源X,和Y,线程T1,线程T2

T1拥有资源X等待Y释放
T2拥有资源Y等待X释放

如何破坏循环等待

  可将每个资源编号,当一个进程占有编号为i的资源时,那么它下一次申请资源只能申请编号大于i的资源

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容