码迷,mamicode.com
首页 > 其他好文 > 详细

synchronized修饰普通方法和静态方法

时间:2018-06-07 21:59:49      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:hash   操作   就是   阻塞   sync   使用   同步方法   方法   style   

首先,要知道,synchronized关键字修饰普通方法时,获得的锁是对象锁,也就是this。而修饰静态方法时,锁是类锁,也就是类名.class。

synchronized修饰普通方法

Synchronized修饰普通方法时,锁是对象锁(this)。

当该类中有多个普通方法被Synchronized修饰(同步),那么这些方法的锁都是这个类的一个对象this。多个线程访问这些方法时,如果这些线程调用方法时使用的是同一个该类的对象,虽然他们访问不同方法,但是他们使用同一个对象来调用,那么这些方法的锁就是一样的,就是这个对象,那么会造成阻塞。如果多个线程通过不同的对象来调用方法(一般都是通过同一个对象访问),那么他们的锁就是不一样的,不会造成阻塞。

基本上都是通过同一个对象操作的,因为不同对象的话,每个对象的数据都不一样,当然不会出现安全问题。

多线程的安全问题,都是对于同一个对象操作的,(操作静态数据不需要同一个对象)

例如,多线程对hashtable操作,肯定是对同一个对象,才会有共享数据。

Hashtable中使用Synchronized来修饰方法,这样相当于对整张表进行锁定了,因为多个线程如果通过同一个HashTable对象访问方法,就会造成阻塞。

但是,通过同一个对象调用非同步方法,是可以的,不会阻塞。

synchronized修饰静态方法

锁是类锁(.class)。这个范围就比对象锁大。这里就算是不同对象,但是只要是该类的对象,就使用的是同一把锁。多个线程调用该类的同步的静态方法时,都会阻塞。

synchronized修饰普通方法和静态方法

标签:hash   操作   就是   阻塞   sync   使用   同步方法   方法   style   

原文地址:https://www.cnblogs.com/xiaolovewei/p/9152718.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!