您的位置:首页 > 编程语言 > Java开发

Java中synchronized关键字的简单理解

2014-06-07 20:06 567 查看
在多线程的程序中,往往需要进行同步、互斥控制,Java提供了synchronized关键字来实现简单的同步互斥操作。synchronized关键字可以用作方法(实例方法和静态方法)的修饰符,可以作为方法内部的语句,即synchronized方法和synchronized语句块。synchronizced关键字可以保证某一时刻一个对象最多只能有一个synchronized方法在执行。

使用synchronized关键字时,要先了解几点:

1、Java中的每个对象都有唯一的一个内部锁与之对应;

2、synchronized关键字是通过使用内部的对象锁来实现同步和互斥的;

3、使用了synchronized关键字,并不意味着绝对的线程安全。

由于sychronized关键字是通过对象的内部锁来实现同步互斥的,于是当某一个对象的一个synchronized方法被某一线程A执行时,其他线程若调用该对象的其他synchronized方法时,均会被阻塞,直到线程A执行完相应的synchronized方法。同时,这也意味着synchronized方法的执行不影响非synchronized方法,即对象的synchronized方法被执行的时候,其非synchronized方法照样可以得到执行。

接下来,简单说一下synchronized的用法。可以使用synchronized关键字声明一个实例方法,如:

public class A {
public synchronized void a(){
//方法
}
}
这样,要调用对象的方法a必须获得该对象的内部锁。于是,对于该对象,每个时刻最多只能有一个synchronized方法在执行。

同样,也可以将静态方法声明为synchronized。当调用这种方法时,该方法获得的是相关的类对象的内部锁。例如,B类有一个静态同步的方法,那么当该方法被调用时,B.class对象的锁被锁住。此时,没有其他线程可以调用同一个类的这个或任何其他的静态同步方法。

还可以在方法内部使用synchronized语句块。例如:

public void b(){
//非同步块语句。
synchronized(this){
//同步块中的语句。
}
}
当该方法执行到synchronized(this)的时候,就会获取该对象的内部锁。同样的,也可以使用同步块synchronized(A.class)来锁住类对象。但是不要使用synchronized( this.getClass() )来锁住类对象,因为这种做法对于该类的子类对象会失效。

synchronized关键字使用对象的内部锁实现同步和互斥,但内部锁存在一些局限:

1、不能中断一个正在试图获得锁的线程。

2、试图获得锁时不能设定超时。

3、每个内部锁只有一个条件,可能是不够的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: