如果我有一个在线程之间共享的对象,在我看来每个字段应该是final或者volatile,具有以下推理:
如果应该更改字段(指向另一个对象,更新原始值),那么该字段应该是volatile所有其他线程对新值进行操作.仅仅访问所述字段的方法的同步是不够的,因为它们可能返回缓存的值.
如果该领域永远不会改变,那就去做吧final.
但是,我找不到任何关于此的内容,所以我想知道这个逻辑是否有缺陷还是太明显?
当然编辑而不是易失性可能使用final AtomicReference或类似.
编辑,例如,请参阅get getter方法是Java中volatile的替代方法吗?
编辑以避免混淆:这个问题是关于缓存失效!如果两个线程对同一个对象进行操作,则可以缓存对象的字段(每个线程),如果它们未声明为volatile.如何保证缓存无效?
最后的编辑感谢@Peter Lawrey,他指出了JLS§17(Java内存模型).据我所知,它表明同步在操作之间建立了先发生关系,因此如果那些更新"发生在之前",则线程会看到来自另一个线程的更新,例如,如果非易失性字段的getter和setter是synchronized.
我正在玩Java语法,所以这个问题纯粹来自于好奇心.这段代码:
http://www.google.com
Object val = 5 <- 4;
Run Code Online (Sandbox Code Playgroud)
并没有编译,因为一个标签(http)"必须紧跟声明".以下两个变体可以编译:
http://www.google.com
{ Object val = 5 <- 4; }
Run Code Online (Sandbox Code Playgroud)
和
Object val;
http://www.google.com
val = 5 <- 4;
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,我都从声明切换到表达式.这让我想知道Java中究竟是什么"声明",但是文档 指出:
除了表达式语句之外,还有另外两种语句:声明语句和控制流语句.声明语句声明一个变量.
该JLS只是说(标签),其
标识符被声明为直接包含的Statement的标签.
它没有说"表达式陈述".
我错过了什么,或者这只是一个不清楚/不正确的规范?
我从 @vue/cli 创建了一个新的 vue 项目$> vue create my-project,激活了 Typescript 选项和路由器选项,并使用$>vue add vue-next.
现在,$>npm run serve失败了
ERROR in /home/auser/dev/my-project/src/router/index.ts(1,10):
1:10 Module '"../../node_modules/vue-router/dist/vue-router"' has no exported member 'RouteConfig'.
> 1 | import { RouteConfig, createRouter, createWebHistory } from 'vue-router';
| ^
2 | import Home from '../views/Home.vue'
Run Code Online (Sandbox Code Playgroud)
整个文件并没有那么长,后面会用到RouteConfig:
ERROR in /home/auser/dev/my-project/src/router/index.ts(1,10):
1:10 Module '"../../node_modules/vue-router/dist/vue-router"' has no exported member 'RouteConfig'.
> 1 | import { RouteConfig, createRouter, createWebHistory } from 'vue-router';
| ^
2 | import Home …Run Code Online (Sandbox Code Playgroud) 我正在开发一个 TODO 列表 PWA,即使应用程序关闭,它也应该在每天上午 8:00 显示当天的任务(类似于闹钟)。
有没有办法通过 PWA 来实现这一目标?(主要针对Chrome/Android)
到目前为止,在我的服务人员中我已经(简化)
self.addEventListener("message", (event) => {
// Workflow: The app sends a message that the timer should be set.
const prom = new Promise((resolveIt) =>
self.setTimeout(() => showAlarmAndResolve(resolveIt, event.data), '<timeout_in_ms>')
);
// tell the service worker to remain alive until promise is resolved
event.waitUntil(prom);
}
});
async function showAlarmAndResolve(resolveIt, text) {
const options = {
body: text,
tag: "todo-alert",
};
await self.registration.showNotification(
"Your tasks for today",
options
);
resolveIt(); // allow the …Run Code Online (Sandbox Code Playgroud) 我有一些非常大的 IPython (1.0) 笔记本,我发现使用它们非常不方便。我想将大笔记本分成几个较小的笔记本,每个都涵盖我分析的特定部分。但是,笔记本需要共享数据和(不可选择的)对象。现在,我希望这些笔记本连接到同一个内核。我该怎么做呢?如何更改笔记本连接的内核?(以及如何自动执行此步骤的任何想法?)
我不想使用并行计算机制(这将是一个微不足道的解决方案),因为在我的情况下它会增加很多代码开销。
java ×2
final ×1
ipython ×1
syntax ×1
typescript ×1
volatile ×1
vue-router ×1
vue.js ×1
vuejs3 ×1