平时对synchronized这个关键字没有太在意,对它的认识停留在粗略翻了一下百度百科的状态,百度百科对它的解释是:
“Java语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。然而,当一个线程访问object的一个加锁代码块时,另一个线程仍然可以访问该object中的非加锁代码块。”
理解得比较宽泛,下面详细描述一下synchronized这个关键字的功能:
首先,synchronized的工作方式是,获得一个 对象的实例 / 类 的锁,然后执行它所包含的代码块,如果不能获得锁,则等待。
注意,这里的锁是在 [对象的实例] 或者 [类] 上的。
synchronized有两种用法,代码块和方法,如下:
public void testMethod(){ synchronized(this){ //todo something } } public static synchronized void testMethod(){ //todo something }
对于代码块的用法而言,synchronized锁定的就是它的括号里的对象或者类;
对于方法的用法而言,静态方法时,synchronized锁定的是这个类;非静态方法时,synchronized锁定的是当前的对象,相当于synchronized(this);
例子:
public class TestSynchronized { public void print1(){ synchronized (""){ System.out.println("1"); } } public void print2() { synchronized (this) { System.out.println("2"); } } public synchronized void print3() { System.out.println("3"); } public synchronized static void print4() { System.out.println("4"); } public static void print5(){ synchronized (TestSynchronized.class) { System.out.println("5"); } } }
执行print1时,可执行的有:2345,其他实例不能执行1
执行print2时,可执行的有:145,不影响其他实例
执行print3时,可执行的有:145,不影响其他实例
执行print4时,可执行的有:123
执行print5时,可执行的有:123
时间: 2024-10-24 10:00:35