gpt4 book ai didi

java - 了解JAVA中的同步方法

转载 作者:行者123 更新时间:2023-11-30 06:13:22 24 4
gpt4 key购买 nike

我是JAVA新手,正在学习JAVA中的多线程。这是我的代码片段。

import java.util.*;
import java.lang.*;
import java.io.*;

class Manager {
static final int MAXQUEUE = 5;
private Vector messages = new Vector();

public synchronized void putMessage() throws InterruptedException {
while (messages.size() == MAXQUEUE) {
System.out.println("waiting for space in queue ");
wait();
}
messages.addElement(new java.util.Date().toString());
System.out.println("created a new message and message count is " + messages.size());
notify();
}

public synchronized String getMessage() throws InterruptedException {
notify();
while (messages.size() == 0) {
System.out.println("queue is empty ");
wait();
}
String message = (String) messages.firstElement();
messages.removeElement(message);
System.out.println("removed a message and message count is " + messages.size());
return message;
}
}

class Producer extends Thread {
Manager myRef;

Producer(Manager ref) {
myRef = ref;
}

public void run() {
try {
while (true) {
myRef.putMessage();
sleep(1000);
}
} catch (InterruptedException e) {
}
}
}

class Consumer extends Thread {
Manager myRef;

Consumer(Manager ref) {
myRef = ref;
}

public void run() {
try {
while (true) {
String message = myRef.getMessage();
System.out.println("Got message: " + message);
sleep(2000);
}
} catch (InterruptedException e) {
}
}

public static void main(String args[]) {
Manager ref = new Manager();
Producer producer = new Producer(ref);
producer.start();
new Consumer(ref).start();
}
}

我的期望:

  1. 首先,我的 Producer 线程将控制 Manager 对象上的锁。它将调用 putMessage() 直到计数为 5 并释放锁。
  2. 现在消费者线程将获取锁并开始读取消息,直到列表为空,然后释放锁。此序列将继续。

但是,发生了什么:

created a new message and message count is 1
removed a message and message count is 0
Got message: Thu Aug 13 07:26:45 GMT 2015
created a new message and message count is 1
removed a message and message count is 0
Got message: Thu Aug 13 07:26:46 GMT 2015
and so on.....

如您所见,我的消费者线程能够调用 readMessage(),即使管理器对象的锁与正在执行 putMessage() 的生产者线程有关。如果一个线程正在执行一个实例方法,另一个线程如何能够调用另一个实例方法?

请指正我的理解。

最佳答案

首先,您的生产者 Thread 执行 putMessage 方法。他创建了一项并将其添加到 messages 列表中。当 putMessage 完成并创建了一个项目时,生产者线程进入 hibernate 状态。

当消费者线程醒来时,他可以自由访问 getMessage 方法并消费唯一的项目。然后消费者进入休眠状态。

这个过程一直在重复。如您所料,synchronized 关键字可防止一个对象的任何同步方法可以并行执行。正如我所解释的那样,这并没有发生。线程只是交替访问方法。对于每个方法调用,只生产或消费一个项目。

关于java - 了解JAVA中的同步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31982478/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com