java web 20 : synchronized
使用synchronized关键字表示同步。使多个线程需要排队访问共享资源,而不是发生抢占现象。
可以修饰方法,也可以修饰代码块。
修饰代码块
注意要锁住并发访问的内容,如果把整个wile都锁住,那将只有一个线程运行该块直到循环结束,所以以下结构不可以写成 while(tickets > 0) {...}
如果共享资源是静态的,用 "类名.class"作为锁对象,防止各自上锁
**********************************************************************************************************************************************************
修饰实例方法:
所谓的实例对象锁就是用 synchronized 修饰实例对象中的实例方法,注意是实例方法不包括静态方法,如下:
public synchronized void increase() { i++; }
synchronized void method{...}
功能上等效于:
void method{
synchronized(this) {...}
}
修饰静态方法
当 synchronized 作用于静态方法时,其锁就是当前类的 class 对象锁。由于静态成员不专属于任何一个实例对象,是类成员,因此通过 class 对象锁可以控制静态成员的并发操作。需要注意的是如果一个线程 A 调用一个实例对象的非 static synchronized 方法,而线程 B 需要调用这个实例对象所属类的静态 synchronized 方法,是允许的,不会发生互斥现象,因为访问静态 synchronized 方法占用的锁是当前类的 class 对象,而访问非静态 synchronized 方法占用的锁是当前实例对象锁,二者的锁并不一样,所以不冲突。
public static synchronized void increase() { i++; }
static synchronized void methode{...}
功能上等效于:
static void method{
synchronized(类名.class) {...}
}