Java实现线程同步方法及原理详解
在多线程程序中,线程的并发执行可能导致数据不一致的问题。而线程同步,是为了解决这个问题。本文将详细讲解Java实现线程同步方法及原理。
什么是线程同步
线程同步,就是多个线程尝试访问同一个共享资源时,只有一个线程能够访问该资源,以确保数据的正确性和资源的高效利用。Java通过synchronized关键字实现线程同步。
synchronized关键字
synchronized是Java中实现线程同步的关键字,它可以用在方法和代码块中。
方法中使用synchronized
public synchronized void method() {
// 方法体
}
这样,当多个线程尝试访问该方法时,只有一个线程能够访问该方法,其他线程需等待该方法执行完毕后才能访问。
代码块中使用synchronized
public void method() {
synchronized (this) {
// 代码块
}
}
这样,当多个线程尝试访问该方法时,只有一个线程能够访问该代码块,其他线程需等待该代码块执行完毕后才能访问。
synchronized原理
当一个线程访问一个带有synchronized关键字的方法时,会自动获取该方法所属对象的锁。其他线程尝试访问该方法时,会等待锁被释放。当该线程执行完毕后,会释放锁,其他线程可以继续访问该方法。
示例
同步方法示例
下面是一个银行取款的示例,利用同步方法实现线程同步:
public class Bank {
private int balance = 100;
public synchronized void withDraw(int amount) {
if (balance >= amount) {
balance -= amount;
System.out.println("取款成功,余额为:" + balance);
} else {
System.out.println("余额不足,取款失败!");
}
}
}
public class Customer extends Thread {
private Bank bank;
public Customer(Bank bank) {
this.bank = bank;
}
@Override
public void run() {
bank.withDraw(80);
}
public static void main(String[] args) {
Bank bank = new Bank();
Customer c1 = new Customer(bank);
Customer c2 = new Customer(bank);
c1.start();
c2.start();
}
}
在上述示例中,两个线程同时访问银行取款方法,由于使用了synchronized关键字,同一时间只有一个线程能够访问该方法,从而保证数据的正确性和资源的高效利用。
同步代码块示例
下面是一个售票的示例,利用同步代码块实现线程同步:
public class TicketSeller extends Thread {
private int ticket = 10;
@Override
public void run() {
synchronized (this) {
while (ticket > 0) {
ticket--;
System.out.println(Thread.currentThread().getName() + "售出一张票,余票为:" + ticket);
}
}
}
public static void main(String[] args) {
TicketSeller ts = new TicketSeller();
Thread t1 = new Thread(ts);
Thread t2 = new Thread(ts);
t1.start();
t2.start();
}
}
在上述示例中,两个线程同时访问售票方法,由于使用了同步代码块,同一时间只有一个线程能够访问该代码块,从而保证数据的正确性和资源的高效利用。
总结
本文详细讲解了Java实现线程同步方法及原理。synchronized关键字可以用在方法和代码块中,通过获取锁实现线程同步。在多线程程序中,线程同步是保证数据的正确性和资源的高效利用的重要机制。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现线程同步方法及原理详解 - Python技术站