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) {...}
 }
 
posted @ 2020-07-24 14:27  Saturn5  阅读(31)  评论(0)    收藏  举报