- Synchronized 关键字
- 示例
- Synchronized 方法
- 内部锁(Intrinsic Locks)和 Synchronization
- 参考资料
下载 Demo
Synchronized 关键字
Java 语言提供两个基本的同步机制:synchronized 方法(synchronized methods )和 synchronized 语句(synchronized statements)。
示例
先大概说一下 Java Synchronized 关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻只有一个线程执行该段代码。
- 当两个线程访问同一个对象 synchronized(this) 代码块时,只能有一个线程执行,另一个线程必须等待这个线程执行完后才能执行;
- 但是,当一个线程访问一个对象 synchronized(this) 同步代码块时,另一个线程仍能访问该对象的非 synchronized(this) 代码块;
- 尤其是,当一个线程访问一个对象的一个 synchronized(this) 代码块时,其他线程对该对象中其他所有 synchronized(this) 代码块的访问也将被阻塞;
- 以上规则对其它对象锁同样适用。
如下代码所示:
package cn.db.syncdemo;
public class NewClass {
/**
* 同步方法
*/
public void synchronizedMethod() {
synchronized (this) {
int i = 5;
while (i-- > 0) {
System.out.println(Thread.currentThread().getName() + " : " + i
+ " synchronized method");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
System.out.println(e.toString());
}
}
}
}
/**
* 同步方法 2
*/
public void synchronizedMethod2() {
synchronized (this) {
int i = 5;
while (i-- > 0) {
System.out.println(Thread.currentThread().getName() + " : " + i
+ " synchronized method 2");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println(e.toString());
}
}
}
}
/**
* 非同步方法
*/
public void nonSynchronizedMethod() {
int i = 5;
while (i-- > 0) {
System.out.println(Thread.currentThread().getName() + " : " + i
+ " nonSynchronized method");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println(e.toString());
}
}
}
public static void main(String[] args) {
final NewClass mClass = new NewClass();
// t1 和 t2 都要访问同一个同步方法 synchronizedMethod
Thread t1 = new Thread(new Runnable() {
public void run() {
mClass.synchronizedMethod();
}
}, "Thread 1");
Thread t2 = new Thread(new Runnable() {
public void run() {
mClass.synchronizedMethod();
}
}, "Thread 2");
// t3 要访问另一个同步方法 synchronizedMethod2
Thread t3 = new Thread(new Runnable() {
public void run() {
mClass.synchronizedMethod2();
}
}, "Thread 3");
// t4 要访问非同步方法 nonSynchronizedMethod
Thread t4 = new Thread(new Runnable() {
public void run() {
mClass.nonSynchronizedMethod();
}
}, "Thread 4");
t1.start();
t2.start();
t3.start();
t4.start();
}
}