ShineYoung

导航

 

Java语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。然而,当一个线程访问object的一个加锁代码块时,另一个线程仍可以访问该object中的非加锁代码块。(摘自百度百科)

首先我们要知道每个对象都有一把锁,叫做对象锁,线程访问这个对象前需要确认这个对象有没有被锁住,被锁住的话就不允许访问

 

synchronized

1.在方法前面加锁

public synchronized void method(){}

其实就是给实例对象加锁,这个对象下面所有包含 synchronized 的方法都只允许只被一个线程调用

2.在静态方法前面加锁

public static synchronized void method(){}

和上面很像,给class对象加锁

3.代码块加锁

synchronized(this){/区块/}

this代表对象锁,如果说不想把当前对象作为对象锁的话,可以Object obj = new Object(),synchronized(obj){/区块/}这样的话就是只是同步了这个方法。

换而言之,如果synchronized(obj1){/区块1/}  synchronized(obj2){/区块2/}  synchronized(obj3){/区块3/}是一个对象的三个代码块

那么一个线程A可以访问区块1,线程B可以访问区块2,线程C可以访问区块3,即使它们三个代码块在一个实例对象里,因为它们对象锁是三个不同的对象锁

 

posted on 2019-03-02 18:58  ShineYoung  阅读(86)  评论(0编辑  收藏  举报