由浅入深,逐步了解 Java 并发编程中的 Synchronized!
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了由浅入深,逐步了解 Java 并发编程中的 Synchronized!,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3174字,纯文字阅读大概需要5分钟。
内容图文
![由浅入深,逐步了解 Java 并发编程中的 Synchronized!](/upload/InfoBanner/zyjiaocheng/618/29496603e56d49a59ba49f179443fbbf.jpg)
synchronized 作用
synchronized 关键字是 Java 并发编程中线程同步的常用手段之一。
1.1 作用:
-
确保线程互斥的访问同步代,锁自动释放,多个线程操作同个代码块或函数必须排队获得锁,
-
保证共享变量的修改能够及时可见,获得锁的线程操作完毕后会将所数据刷新到共享内存区;
-
不解决重排序,但保证有序性。
1.2 用法:
-
修饰实例方法
synchronized 关键词作用在方法的前面,用来锁定方法,其实默认锁定的是 this 对象。
修饰静态方法synchronized 还是修饰在方法上,不过修饰的是静态方法,等价于锁定的是 Class 对象。
修饰代码块
用法是在函数体内部对于要修改的参数区间用 synchronized 来修饰,相比与锁定函数这个范围更小,可以指定锁定什么对象。
总结:
- synchronized 修饰的实例方法,多线程并发访问时,只能有一个线程进入,获得对象内置锁,其他线程阻塞等待,但在此期间线程仍然可以访问其他方法。
- synchronized 修饰的静态方法,多线程并发访问时,只能有一个线程进入,获得类锁,其他线程阻塞等待,但在此期间线程仍然可以访问其他方法。
- synchronized 修饰的代码块,多线程并发访问时,只能有一个线程进入,根据括号中的对象或者是类,获得相应的对象内置锁或者是类锁
- 每个类都有一个类锁,类的每个对象也有一个内置锁,它们是互不干扰的,也就是说一个线程可以同时获得类锁和该类实例化对象的内置锁,当线程访问非 synchronzied 修饰的方法时,并不需要获得锁,因此不会产生阻塞。
管程
管程(英语:Monitors,也称为监视器) 在操作系统中是很重要的概念,管程其实指的是管理共享变量以及管理共享变量的操作过程。有点扮演中介的意思,管程管理一堆对象,多个线程同一时候只能有一个线程来访问这些东西。
管程可以看做一个软件模块,它是将共享的变量和对于这些共享变量的操作封装起来,形成一个具有一定接口的功能模块,进程可以调用管程来实现进程级别的并发控制。进程只能互斥地使用管程,即当一个进程使用管程时,另一个进程必须等待。当一个进程使用完管程后,它必须释放管程并唤醒等待管程的某一个进程。管程解决互斥问题相对简单,需要把共享变量以及共享变量的操作都封装在一个类中。 -
当线程 A 和线程 B 需要获取共享变量 count 时,就需要调用 get 和 set 方法,而 get 和 set 方法则保证互斥性,保证每次只能有一个线程访问。
生活中举例管程,比如链家店长分配给每个中介管理一部分二手房源,多个客户通过中介进行房屋买卖。
-
中介就是管程。
-
多个二手房源被一个中介管理中,就是一个管程管理着多个系统资源。
-
多个客户就相当于多个线程。
Synchronzied 的底层原理
对象头解析
我们知道在 Java 的 JVM 内存区域中一个对象在堆区创建,创建后的对象由对象头、实例变量、填充数据三部分组成。这三部分功能如下:
-
填充数据:由于虚拟机要求对象起始地址必须是 8 字节的整数倍。填充数据不是必须存在的,仅仅是为了字节对齐。
-
实例变量:存放类的属性数据信息,包括父类的属性信息,这部分内存按 4 字节对齐。
-
对象头:主要包括两部分 Klass Point 跟 Mark Word。
-
Klass Point (类型指针):是对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。Mark Word (标记字段):这一部分用于储存对象自身的运行时的数据,如哈希码、GC 分代年龄、锁状态标志、锁指针等。这部分数据在 32 bit 和 64 bit 的虚拟机中大小分别为 32 bit 和 64 bit,考虑到虚拟机的空间效率,Mark Word 被设计成一个非固定的数据结构,以便在极小的空间中存储尽量多的信息,它会根据对象的状态复用自己的存储空间(跟 ConcurrentHashMap 里的标志位类似),详细情况如下图:
-
-
-
内容总结
以上是互联网集市为您收集整理的由浅入深,逐步了解 Java 并发编程中的 Synchronized!全部内容,希望文章能够帮你解决由浅入深,逐步了解 Java 并发编程中的 Synchronized!所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。