首先,要知道,synchronized关键字修饰普通方法时,获得的锁是对象锁,也就是this。而修饰静态方法时,锁是类锁,也就是类名.class。
synchronized修饰普通方法
Synchronized修饰普通方法时,锁是对象锁(this)。
当该类中有多个普通方法被Synchronized修饰(同步),那么这些方法的锁都是这个类的一个对象this。多个线程访问这些方法时,如果这些线程调用方法时使用的是同一个该类的对象,虽然他们访问不同方法,但是他们使用同一个对象来调用,那么这些方法的锁就是一样的,就是这个对象,那么会造成阻塞。如果多个线程通过不同的对象来调用方法(一般都是通过同一个对象访问),那么他们的锁就是不一样的,不会造成阻塞。
基本上都是通过同一个对象操作的,因为不同对象的话,每个对象的数据都不一样,当然不会出现安全问题。
多线程的安全问题,都是对于同一个对象操作的,(操作静态数据不需要同一个对象)
例如,多线程对hashtable操作,肯定是对同一个对象,才会有共享数据。
Hashtable中使用Synchronized来修饰方法,这样相当于对整张表进行锁定了,因为多个线程如果通过同一个HashTable对象访问方法,就会造成阻塞。
但是,通过同一个对象调用非同步方法,是可以的,不会阻塞。
synchronized修饰静态方法
锁是类锁(.class)。这个范围就比对象锁大。这里就算是不同对象,但是只要是该类的对象,就使用的是同一把锁。多个线程调用该类的同步的静态方法时,都会阻塞。
原文地址:https://www.cnblogs.com/xiaolovewei/p/9152718.html
时间: 2024-10-12 11:30:07