我有一个在多核系统上运行的存储过程。它以多线程方式执行。由于,可能是查询中的某些事情,某些线程的执行会因 cx_packet 等待和锁定而永远挂起。有没有办法强制单线程执行?(我知道这不是最好的解决方案,但至少在查询得到更好的优化之前是有帮助的。)
我对网络开发很陌生.从我所看到的种族条件我想到的节点或JS它们是不可能的,因为它是单线程的,但我看到的是......我猜错了.有了这个小例子,有人可以解释它是如何工作的.
如果有一个1000美元的银行账户,两个人在完全相同的时间向该账户收取费用.第一人收费600美元,第二人收费200美元.
第一笔费用为1000美元 - 600美元,余额为400美元.但是,由于第二次充电同时达到1000美元 - 200美元,余额为800美元.显然,现在的余额应该是200美元.
根据我的理解会导致竞争条件,不是吗?您如何设置它以避免此问题?我不需要确切的代码,也许有人向我解释这个,或伪代码.
提前致谢.
编辑:我将编辑它最初如何设置代码导致竞争条件.
就像下面的帖子说的那样.代码将被设置为当帐户被点击时,它将减去金额并给出新的余额.显然这会导致比赛状况.
这是我的节点 js 后端 API 方法。
apiRouter.route('/makeComment')
.post((req, res) => {
consoleLogger.info("Inside makeComment API..");
logger.info("Inside makeComment");
let timestamp = new Date().getTime();
let latestCommentID = timestamp.toString();
console.log("comment ID generated is "+latestCommentID);
res.json({
'makeComment': 'success',
'commentid':latestCommentID
});
});
Run Code Online (Sandbox Code Playgroud)
现在,如果多个并发请求来到这个 API,会发生什么?
据我了解,NodeJS 会为请求维护一个事件队列,并一一处理请求。
因此,不可能为两个不同的请求获得相同的时间戳。
请让我知道我的理解是否正确?
编辑1:
google了一段时间,得到了这个链接,里面的一些概念解释的很清楚。
正如在标题中那样 - 在Java的单线程编程环境中,volatile是否有用?我知道它用于确保变量的值总是在内存中实际检查,因此在任何情况下,该值可能会以app /编译器不会注意到的方式更改(在单线程应用程序中)?
我遇到一种情况,我需要实现一个线程安全的方法,该方法一次只能由一个线程执行,当该方法由一个线程执行时,所有其他尝试执行同一方法的线程都应该执行t 等待并且必须退出该方法。
同步在这里没有帮助,因为线程将等待顺序执行该方法。
我想我可以通过使用下面的代码使用 ConcurrentHashMap 来实现这一点,但不确定这是否是实现它的完美方法。
Class Test {
private ConcurrentHashMap<String, Object> map = new ConcurrentHashMap<>();
public void execute() {
if (map.putIfApsent("key", new Object()) != null) { // map has value for key which means a thread has already entered.
return; // early exit
}
threadSafeMethod();
map.remove("key");
}
private void threadSafeMethod() {
// my code
}
}
Run Code Online (Sandbox Code Playgroud) java concurrency multithreading synchronization single-threaded
我想比较NodeJS,Go lang和Java.我搜索并发控制.结果是Java的并发控制是多线程的,NodeJS和Go lang的并发控制是单线程.那么,我想知道NodeJS和Go的单线程如何比Java的多线程更好?
谁能帮我 ?每个评论都要Ty.