欢迎访问宙启技术站
智能推送

Java多线程函数:synchronized和wait-notify机制

发布时间:2023-06-30 18:06:37

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机制可以实现线程之间的通信,实现线程的等待和唤醒。合理使用这两个机制可以提高多线程程序的性能和可靠性。