博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java多线程之synchronized详解
阅读量:4163 次
发布时间:2019-05-26

本文共 1395 字,大约阅读时间需要 4 分钟。

synchronized作用

关键字synchronized可以修饰方法或者以同步块的形式来进行使用,它主要确保多个线程在同一个时刻,只能有一个线程处于方法或者同步块中,它保证了线程对变量访问的可见性和排他性,又称为内置锁机制。

synchronized的类锁和对象锁,本质上是两把锁,类锁实际锁的是每一个类的class对象。对象锁锁的是当前对象实例。每个锁对象都有两个队列,一个是就绪队列,一个是阻塞队列。就绪队列存储了将要获得锁的线程,阻塞队列存储了被阻塞的线程。一个线程被唤醒后才会进入就绪队列,等待CPU调度。

在JDK1.5及之前的版本中,synchronized关键字加锁的性能开销比较大,往往推荐使用原子类。但是在JDK1.6及其之后的版本中,synchronized的性能大大提升。

synchronized具有如下特点:

  • synchronized支持可重入。即A线程调用同步方法method1后,method1内部还调用了同步方法method2,。如果不支持可重入的话,就会造成死锁。
  • synchronized在获取锁后,如果出现异常,会自动释放锁
  • 如果子类重写了父类的同步方法,则该同步是不会继承的,必须在子类中重新定义synchronized
  • synchronized修饰静态方法,获取的锁是类class锁,如果有多个实例对象,且多个线程访问这些不同实例对象的synchronized静态方法时,仍为同步状态
  • synchronized静态方法和synchronized(Object.class)的作用一致
  • JVM中String具有常量池缓存的功能,即String a="AA"和String b="AA"是相同对象的,因此synchronized(字符串)是同步调用的,不过这种用法比较少】

静态同步方法

同一个类中所有被synchronized修饰的静态方法,它们在类范围内是同步的,即同一时间内只能有一个线程可以调用它们中的任意一个方法。如果有第二个线程调用其中的任何一个方法,那么这个线程将挂起,直到前面的线程执行完同步静态方法后,才会再次被唤醒,执行相应的静态方法。

不同类中的静态同步方法互不影响。

java平台会给类分配一个类锁,每个线程访问该类时,会观察类锁是否释放

非静态同步方法

同一个类中的所有被synchronized修饰的非静态方法,它们在同一个对象上是同步的。即对于这个类的某个对象,当一个线程调用某个同步方法的时候,如果有第二个线程在同一个对象上调用某个同步的非静态方法,那这个线程会被挂起。

在不同对象上访问非静态同步方法不受同步限制。

java平台会给每个对象分配对应的对象锁,每个线程访问该对象时,会观察对象锁是否释放。

同步代码块

同步代码块可以使用在任何方法中,作用与同步方法类似。

对于同步代码块中的代码,将以括号中的引用所指向的对象为单位进行同步。即如果有多个线程同时访问同步代码块,而且同步代码块中对象的引用又是指向同一个对象的,那么就只有一个线程能够进入代码块执行。

语法如下:

synchronized(对象的引用) {
同步代码}

多个线程调用同步代码块的时候,必须保证多个线程看到的对象是同一个,即括号中代表的是同一个对象,否则同步无效

同步方法的本质:在多线程环境下,保证关键变量是由某个线程独享的

转载地址:http://rwpxi.baihongyu.com/

你可能感兴趣的文章
在C++中如何实现模板函数的外部调用
查看>>
在C++中,关键字explicit有什么作用
查看>>
C++中异常的处理方法以及使用了哪些关键字
查看>>
内存分配的形式有哪些? C++
查看>>
什么是内存泄露,如何避免内存泄露 C++
查看>>
什么是缓冲区溢出 C++
查看>>
sizeof C++
查看>>
使用指针有哪些好处? C++
查看>>
引用还是指针?
查看>>
checkio-non unique elements
查看>>
checkio-medium
查看>>
checkio-house password
查看>>
checkio-moore neighbourhood
查看>>
checkio-the most wanted letter
查看>>
Redis可视化工具
查看>>
大牛手把手带你!2021新一波程序员跳槽季,全套教学资料
查看>>
Guava Collections API学习之AbstractMapBasedMultimap
查看>>
jQuery1.9(动画效果)学习之——.queue()
查看>>
HTML5学习之——概念篇
查看>>
HTML5学习之——HTML 5 视频
查看>>