栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

多线程基础篇-07

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

多线程基础篇-07

文章目录

第一章 数据同步的引入与Synchronized


文章目录
  • 文章目录
  • 一、互斥锁
  • 二、关于Synchronized
  • 三、锁范围
  • 四、可重入性
  • 五、公平性
  • 五、不可中断性


一、互斥锁

为了保证数据同步,那么就必须要引入锁来确保。互斥锁是常用的同步手段,在并发过程中,当多条线程对同一个共享数据竞争时,它能保证共享数据同一时刻只能被一条线程使用,而其他线程只能等到锁释放后才能重新竞争。对于java开发人员,我们最熟悉的肯定就是用Synchronized关键词来完成锁功能。在涉及到多线程并发时,针对某些变量,你应该会毫不犹豫地加上Synchronized去保证变量的同步性。

二、关于Synchronized

在C/C++语言中,我们可以直接使用操作系统提供的互斥锁来实现同步。而java语言则与之不同,java需要把这些底层封装。java提供的Synchronized就是一个典型的互斥锁,同时它也是一个jvm级别的锁。它的实现细节全部封装在JVM中,对于开发人员只提供了Synchronized关键字。根据锁的颗粒度,可以用Synchronized对一个变量、一个方法、一个对象或一个类进行加锁。

三、锁范围

锁定范围要根据synchronized来确定。假如明确指定了锁对象,例如synchronized(变量)、synchronized(this)等,则说明加解锁对象为变量或运行时对象。假如没有明确指定对象,则根据synchronized修饰的方法去找对应的锁对象。如修饰一个非静态方法表示此方法对应的对象为锁对象,如修饰一个静态方法则表示此方法对应的类对象为锁对象。当一个对象被锁住时,对象里面所有用synchronized修饰的方法都将产生堵塞,而对象里非synchronized修饰的方法可正常被调用,不收锁影响。
synchronized对应指令:
被synchronized修饰的程序块经过编译后,会在其前后生成monitorenter和monitorexit两个字节码指令。为了实现互斥锁,JVM的monitorenter和monitorexit字节码依赖底层操作系统的互斥锁来实现。Java层面的线程与操作系统的原生线程有映射关系,这时如果要将一个线程进行阻塞或唤起都需要操作系统的协助。这步操作需要从用户态切换到内核态来执行,这种切换代价是十分昂贵的,需要消耗很多处理器时间。如果可能,应该减少这样的切换。JVM一般会采取一些措施来进行优化,例如在把线程进行阻塞操作之前先让线程自旋等待一段时间。这样在等待期间其他线程可能已经解锁,这时就无需再让线程执行阻塞操作,避免了用户态到内核态的切换。

四、可重入性

Synchronized有一个非常重要的特性——可重入性。这个特性主要是针对当前线程而言的,可重入即是自己可以再次获得自己的内部锁。在尝试获取对象锁时,如果当前线程已经拥有了此对象的锁,则把锁的计数器加一。而在释放锁时则对应地减一,当锁计数器为0时表示锁完全被释放,此时其他线程可对其加锁。可重入特性主要是为了解决自己锁死自己的情况,比如下面的伪代码
死锁例子
这种情况其实也并非不常见,一个类中的同步方法调用另一个同步方法。假如synchronized不支持重入,进入method2方法时当前线程将尝试获取deadLock对象的锁。而method2方法里面执行method1方法时,当前线程又要去尝试获取deadLock对象的锁。这时由于不支持重入,它要去等deadLock对象的锁释放,把自己阻塞了,这就是自己锁死自己的现象。所以重入机制的引入,杜绝了这种情况的发生。

五、公平性

synchronized实现的是一个非公平锁,非公平主要表现在获取锁的行为上。它并非是按照申请锁的时间前后给等待线程分配锁的,而是每当锁被释放后,任何一个线程都有机会竞争到锁。这样做的目的是为了提高执行性能,当然也会产生线程饥饿现象。

五、不可中断性

synchronized最后一个特性就是不可中断,在所有等待的线程中,我们唯一能做的就是等待。而实际情况可能是有些任务等了足够久了,我要取消此任务去干别的事情。此时synchronized是无法帮你实现的,因为它把所有实现机制都交给了JVM,虽然提供了方便性但同时也体现了它的局限性。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/877402.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号