Java多线程函数:synchronized和wait-notify机制
Java中的多线程编程是面向对象编程的重要内容之一,可以实现线程的并发执行,提高程序的性能。在多线程编程中,synchronized和wait-notify机制是两个重要的概念。本文将对这两个概念进行详细介绍。
一、synchronized关键字
synchronized关键字可以用来修饰方法或代码块,实现对共享资源的同步访问。被synchronized修饰的方法或代码块,在同一时间只能被一个线程访问,其他线程需要等待。
1. 类锁和对象锁
在Java中,synchronized关键字可以实现类锁和对象锁。
1.1 类锁
在synchronized关键字修饰的静态方法或代码块中,使用的是类锁。当一个线程访问一个静态方法或代码块时,其他线程需要等待,直到当前线程释放类锁。
1.2 对象锁
在synchronized关键字修饰的实例方法或代码块中,使用的是对象锁。当一个线程访问一个对象的实例方法或代码块时,其他线程需要等待,直到当前线程释放对象锁。
2. 实例
下面是一个使用synchronized关键字实现线程同步的实例:
public class SynchronizedDemo {
private int count = 0;
private Object lock = new Object();
public synchronized void increase() {
count++;
}
public void increaseWithLock() {
synchronized (lock) {
count++;
}
}
}
在上面的示例中,increase方法和increaseWithLock方法都是对count进行自增操作。increase方法使用的是对象锁,而increaseWithLock方法使用的是lock对象作为锁。
二、wait和notify
在多线程编程中,wait和notify机制可以实现线程之间的通信,实现线程的等待和唤醒。
1. wait方法
wait方法用于使调用该方法的线程进入等待状态,直到其他线程调用了相同对象的notify或notifyAll方法将其唤醒。线程在调用wait方法之后,释放了该对象上的锁,并进入等待队列,直到被唤醒后重新获取锁。
2. notify方法
notify方法用于唤醒在此对象监视器上等待的单个线程。如果有多个线程在该对象上等待,则只会唤醒其中一个。
3. 实例
下面是一个使用wait和notify方法实现线程通信的实例:
public class WaitNotifyDemo {
private Object lock = new Object();
public void printA() {
synchronized (lock) {
while (true) {
System.out.println("A");
lock.notify();
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public void printB() {
synchronized (lock) {
while (true) {
System.out.println("B");
lock.notify();
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
WaitNotifyDemo demo = new WaitNotifyDemo();
new Thread(demo::printA).start();
new Thread(demo::printB).start();
}
}
在上面的示例中,printA方法和printB方法分别打印字母A和字母B,并使用wait和notify方法实现线程间的交替打印。
总结
本文介绍了Java多线程函数中的synchronized关键字和wait-notify机制。synchronized关键字可以实现对共享资源的同步访问,保证线程安全;wait和notify机制可以实现线程之间的通信,实现线程的等待和唤醒。合理使用这两个机制可以提高多线程程序的性能和可靠性。
