Java线程同步方法实例总结
什么是线程同步?
在Java多线程中,多个线程同时访问同一份数据时,就有可能出现数据的不一致性。而线程同步就是一种提供独占访问共享资源的机制,确保同时只有一个线程访问共享资源,从而避免并发访问导致的数据不一致性问题。
如何实现线程同步?
Java语言提供了两种实现线程同步的机制:synchronized同步块和Lock锁。
synchronized同步块
synchronized
可以作用于对象及其方法,可以提供互斥锁,保证同一时间只有一个线程访问被同步的代码块或方法。synchronized同步块的用法为:
synchronized(object){
//同步代码块
}
其中object
是被锁住的对象,用于实现互斥。当一个线程进入同步代码块时,它将会尝试获取该object的锁,如果锁已经被其他线程占用,则该线程将进入阻塞状态,直到锁被其他线程释放。
示例1:同步块示例
public class Ticket implements Runnable{
private int num = 10;//共十张票
//同步代码块,锁定的是this对象
public void run() {
synchronized (this) {
while(num>0) {
try {
System.out.println(Thread.currentThread().getName() + "卖出第" + num + "张票");
Thread.sleep(1000);
num--;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
Lock锁
Lock锁是Java5新增的一种互斥同步锁机制,与synchronized相比,Lock锁提供了更高的灵活性。Lock锁的用法为:
Lock lock = new ReentrantLock();
lock.lock(); //加锁
try{
//同步代码块
}finally {
lock.unlock(); //释放锁
}
示例2:Lock锁示例
public class Account {
private Lock accountLock = new ReentrantLock();//实例化一个Lock锁
private int balance = 1000;//余额
//加钱
public void deposit(int amount) {
accountLock.lock(); //加锁
try{
balance += amount;
System.out.println(Thread.currentThread().getName() + "存入" + amount + "元, 当前账户余额为:" + balance);
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}finally{
accountLock.unlock(); //释放锁
}
}
//取钱
public void withdraw(int amount) {
accountLock.lock();//加锁
try{
if(balance >= amount) {
balance -= amount;
System.out.println(Thread.currentThread().getName() + "取出" + amount + "元, 当前账户余额为:" + balance);
Thread.sleep(1000);
}else {
System.out.println(Thread.currentThread().getName() + "取钱失败!余额不足!");
}
}catch(InterruptedException e){
e.printStackTrace();
}finally{
accountLock.unlock();//释放锁
}
}
}
总结
以上是Java线程同步的两种实现机制,其中synchronized
同步块相对简单,但是灵活性不如Lock锁。在实际开发中,应根据具体的业务需求进行选择。同时,保证代码易于理解且符合线程安全的最佳实践也是非常重要的。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java线程同步方法实例总结 - Python技术站