如果一个谷歌用于"区别notify()和之间notifyAll()",那么会弹出很多解释(将javadoc段落分开).这一切都归结为等待线程被唤醒的数量:一个进入notify()和全部进入notifyAll().
但是(如果我确实理解了这些方法之间的区别),总是只选择一个线程用于进一步的监视器获取; 在第一种情况下,由VM选择的一种情况,在第二种情况下由系统线程调度程序选择的一种情况.一般情况下,程序员都不知道它们的确切选择程序(在一般情况下).
那么notify()和notifyAll()之间的有用区别是什么?我错过了什么吗?
我想知道为什么线程会自动从java中的wait()中唤醒.
这是一个设计决定吗?这是妥协吗?
编辑:(来自Java Concurrency in Practice,p.300)
wait甚至允许"虚假地"返回 - 不响应任何调用通知的线程.
作者进一步指出:
这就像一个连接器松动的烤面包机,当烤面包准备好时,铃铛会关闭,有时候还没有准备好.
这就是为什么你总是需要像
synchronized(this){
while(!condition)
wait();
}
}
Run Code Online (Sandbox Code Playgroud)
永不
synchronized(this){
if(!condition){
wait();
}
}
Run Code Online (Sandbox Code Playgroud)
即使条件仅从转换
false到true.
如果我只使用synchronized,而不是wait/notify方法,它是否仍然保持线程安全?
有什么不同 ?
Thx提前.
Object当一些BlockingQueue人有一个项目给我时,我需要异步通知.
我已经在Javadoc和网络上搜索了一个预先制定的解决方案,然后我最终得到了一个(也许是天真的)我的解决方案,这里是:
interface QueueWaiterListener<T> {
public void itemAvailable(T item, Object cookie);
}
Run Code Online (Sandbox Code Playgroud)
和
class QueueWaiter<T> extends Thread {
protected final BlockingQueue<T> queue;
protected final QueueWaiterListener<T> listener;
protected final Object cookie;
public QueueWaiter(BlockingQueue<T> queue, QueueWaiterListener<T> listener, Object cookie) {
this.queue = queue;
this.listener = listener;
this.cookie = cookie;
}
public QueueWaiter(BlockingQueue<T> queue, QueueWaiterListener<T> listener) {
this.queue = queue;
this.listener = listener;
this.cookie = null;
}
@Override
public void run() {
while (!isInterrupted()) {
try {
T item = …Run Code Online (Sandbox Code Playgroud) 我用Java Servlets实现了一个Web服务.
我得到了以下设置:有一个处理'job'-entries的数据库.每个作业都具有"正在执行"或"在队列中"或"已完成"的状态.如果用户启动新作业,则会在数据库中创建一个带有作业且状态为"队列"的条目.
只有在已执行少于五个其他作业的情况下才能执行作业.如果还有其他五个已经执行状态需要保持"队列"并且Cronjob将在稍后处理该作业的执行.
现在我只是想知道,如果目前执行的工作少于五个,我的脚本将执行这项工作.但是,如果同时在我的脚本询问数据库正在执行多少作业和开始执行作业的脚本之间,另一个用户的另一个请求会创建一个作业,并且还会得到"四个执行作业"数据库.
然后会出现竞争条件,并且将执行6个工作.
我怎么能防止这样的事情?有什么建议?非常非常感谢你!
我刚刚编写了一个简单的java示例来熟悉wait和notify方法的概念.
这个想法是,在调用时notify(),主线程将打印总和.
MyThread类
public class MyThread extends Thread {
public int times = 0;
@Override
public void run() {
synchronized (this) {
try {
for (int i = 0; i < 10; i++) {
times += 1;
Thread.sleep(500);
if (i == 5) {
this.notify();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
主类
public class Main {
public static void main(String[] args) {
MyThread t = new MyThread();
synchronized (t) {
t.start();
try { …Run Code Online (Sandbox Code Playgroud) 我还没有工作multithreading,加入和等待有什么区别,通知方法?差异仅限于获取lock和禁止其他人threads访问它或是否有其他用例?
为什么我应该去wait和notify在multithreading何时join可用于完成thread执行?
如果提供了任何实时示例,将会很有帮助
这个问题可能会重复,所以请告诉我这是否属实。
我试图了解 Java 中的同步,但我不清楚“何时wait()在对象类中使用方法”。
假设我有如下简单的课程。
class Test {
static class Example {
int value = 0;
public synchronized void increment() {
value++;
}
}
public static void main(String[] args) throws InterruptedException {
Example example = new Example();
Thread[] threads = new Thread[10];
for (int i = 0; i < 10; i++) {
threads[i] = new Thread(() -> example.increment());
threads[i].start();
}
for (Thread thread : threads) {
thread.join();
}
System.out.println(example.value);
}
}
Run Code Online (Sandbox Code Playgroud)
10 个线程尝试调用同步increment方法。这很有效,但奇怪的是我从未在方法notify()中调用方法increment() …