Java多线程并发synchronized 关键字攻略
什么是synchronized
synchronized是Java中用于控制并发访问的关键字,它能够确保程序在执行synchronized代码块或方法时,同一时刻只有一个线程可以进入,其他线程必须等待,直到当前线程执行完毕。
如何使用synchronized
在Java中,synchronized可以用于两个场景:synchronized代码块和synchronized方法。
synchronized代码块
使用synchronized代码块的格式如下:
synchronized (obj) {
// 这里的代码只能由一个线程执行
}
其中,obj表示要锁定的对象,一般可以是一个共享资源对象。当一个线程进入了synchronized代码块,它会自动获取锁,其他线程必须等待此线程执行完毕,释放锁之后才能进入此代码块。
synchronized方法
使用synchronized方法的格式如下:
public synchronized void doSomething() {
// 这里的代码只能由一个线程执行
}
使用synchronized修饰方法时,整个方法都被锁定了,其他线程必须等待此线程执行完毕,释放锁之后才能调用此方法。
示例说明
下面我们通过两个示例来说明synchronized的用法。
示例一:使用synchronized代码块
public class Counter {
private int count = 0;
public void add(int num) {
synchronized (this) {
count += num;
}
}
public int getCount() {
return count;
}
}
在上面的示例中,Counter类维护了一个count变量,我们需要对其进行并发访问控制。在add方法中,我们用synchronized关键字修饰了代码块,以this作为锁定对象。这样,当多个线程同时调用add方法时,只有一个线程会进入代码块,其他线程会被阻塞,直到当前线程执行完毕后释放锁。
示例二:使用synchronized方法
public class Counter {
private int count = 0;
public synchronized void add(int num) {
count += num;
}
public synchronized void sub(int num) {
count -= num;
}
public int getCount() {
return count;
}
}
在上面的示例中,我们用synchronized关键字修饰了add和sub方法。这意味着当多个线程同时调用add或sub方法时,只有一个线程会执行方法体,其他线程会被阻塞,直到当前线程执行完毕后释放锁。
总结
synchronized是Java中用于控制并发访问的关键字,使用synchronized可以确保同一时刻只有一个线程访问某个代码块或方法,从而在多线程并发访问时保证数据的正确性。我们可以使用synchronized代码块或synchronized方法来控制并发访问。需要注意的是,在使用synchronized时需要找到合适的锁定对象,避免死锁等问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java多线程并发synchronized 关键字 - Python技术站