什么是synchronized关键字?
synchronized
是Java关键字,通常用于保证多个线程在竞态条件下互斥访问某些共享状态(例如变量或对象)的访问,以避免并发问题的出现。synchronized可以用于方法和代码块两种形式。
使用攻略:
1. synchronized关键字修饰方法
当我们希望一个方法在执行的过程中,是线程安全的,即多个线程同时访问该方法,不会出现同步问题,那我们可以使用synchronized
关键字修饰该方法。
语法:public synchronized void function() { ... }
示例:
class MyThread extends Thread{
private static int ticket = 100; //共享数据
public void run(){
while(ticket > 0){
sale();
}
}
public synchronized void sale(){ //同步方法
if(ticket > 0){
System.out.println(Thread.currentThread().getName()+" 还剩余 "+ticket--+" 张票");
}
}
}
2. synchronized关键字修饰代码块
当一个方法不需要完全同步,只是某段代码需要同步时,我们就可以使用synchronized
关键字来修饰该代码块。在代码块执行期间,其他线程将无法执行这个代码块的方法部分。如果要锁定对象,则可以将代码块括在synchronized(this) {}
中。
语法:synchronized(Object object){ ... }
示例:
class MyThread extends Thread{
private Object lock;
public MyThread(Object lock){
this.lock = lock;
}
public void run(){
synchronized (lock){ //同步代码块
System.out.println(Thread.currentThread().getName()+" get the lock");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" release the lock");
}
}
}
总结
synchronized
关键字用于保证多个线程对共享状态的互斥访问,可以用于方法和代码块两种形式。使用synchronized
关键字时,需要注意以下几点:
- 给对象加锁时,需要选取一个通用的对象作为锁。
- 不要在
synchronized
代码块中调用会抛出异常的方法,否则可能会导致锁无法释放。 - 在锁定代码块时,应尽量缩小锁定范围,以提高程序的性能。