- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在 C# 中,这是以线程安全的方式调用事件的标准代码:
var handler = SomethingHappened;
if(handler != null)
handler(this, e);
Delegate.Combine
创建一个新的多播委托(delegate)实例,然后它在编译器生成的字段上设置(使用互锁比较交换)。
var localFoo = this.memberFoo;
if(localFoo != null)
localFoo.Bar(localFoo.baz);
this.memberFoo
可以由另一个线程设置。 (这只是一个线程,所以我认为它不需要互锁 - 但也许这里有副作用?)
Foo
是“足够不可变的”,因此我们不会在该线程上使用它时主动修改它。)
thing.memberFoo = new Foo(1234);
Foo
分配的不是碰巧在运行“读取器”的 CPU 的缓存中,带有未初始化的值?什么确保
localFoo.baz
(上)不读垃圾? (跨平台的保证有多好?在 Mono 上?在 ARM 上?)
thing.memberFoo = FooPool.Get().Reset(1234);
Q
中存储了一个引用(内存位置)。 R
,并写入对 R
的引用进入 Q
Q
,并取回内存位置 R
R
中读取一个值R
来自
乙 的缓存,来自之前
一个 在初始化期间修改了它,这样当
乙 来自
R
尽管它获得了
Q
的新版本,但它仍然获得了陈旧的值。哪里知道
R
是第一位的?
R
的修改对 CPU 可见
B 在对
Q
的更改对 CPU
B 可见时或之前)
new
分配的内存,或任何内存?)+
最佳答案
这是一个很好的问题。让我们考虑你的第一个例子。
var handler = SomethingHappened;
if(handler != null)
handler(this, e);
add
的默认实现和
remove
事件的访问器会创建内存屏障。我相信 CLR 的早期版本采用了明确的
lock
及更高版本使用
Interlocked.CompareExchange
.如果您实现了自己的访问器并省略了内存屏障,那么答案可能是否定的。我认为实际上这在很大程度上取决于 Microsoft 是否为多播委托(delegate)本身的构建添加了内存障碍。
var localFoo = this.memberFoo;
if(localFoo != null)
localFoo.Bar(localFoo.baz);
memberFoo
类型为
Foo
其定义如下。
public class Foo
{
public int baz = 0;
public int daz = 0;
public Foo()
{
baz = 5;
daz = 10;
}
public void Bar(int x)
{
x / daz;
}
}
this.memberFoo = new Foo();
/* 1 */ set register = alloc-memory-and-return-reference(typeof(Foo));
/* 2 */ set register.baz = 0;
/* 3 */ set register.daz = 0;
/* 4 */ set this.memberFoo = register;
/* 5 */ set register.baz = 5; // Foo.ctor
/* 6 */ set register.daz = 10; // Foo.ctor
memberFoo
在构造函数运行之前发生。这是有效的,因为从执行它的线程的角度来看,它没有任何意外的副作用。但是,它可能会对其他线程产生重大影响。如果您对
memberFoo
进行空检查会发生什么当写入线程刚刚完成指令#4 时,在读取线程上发生了什么?读者将看到一个非空值,然后尝试调用
Bar
之前
daz
变量设置为 10。
daz
仍将保持其默认值 0,从而导致除以零错误。当然,这主要是理论上的,因为 Microsoft 的 CLR 实现在写入时创建了一个可以防止这种情况的发布栅栏。但是,该规范在技术上允许这样做。见
this question对于相关内容。
关于c# - 为什么标准 C# 事件调用模式是线程安全的,没有内存屏障或缓存失效?类似的代码呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30759836/
在Java编程中,使用private关键字修饰了某个成员,只有这个成员所在的类和这个类的方法可以使用,其他的类都无法访问到这个private成员。 上面描述了private修饰符的基本职能,今天来
我是 JWT 的新手,想知道当用户退出应用程序时是否可以在服务器端使 JWT 失效/作废(我也想知道它是否有意义 这样做!)。思路是: 用户点击其应用中的注销链接 应用调用 POST https://
是否有可能使特定操作的 PageCache 无效或删除。 考虑一下: class SiteController extends Controller { public function beh
我使用的是 XCode 9,OSX 而不是 iOS,Objective-C。 我有一个 XPC 服务可以与其他应用程序通信。 XPC 服务对我来说是全新的。我已经阅读了我找到的文档和文章 - 我仍然需
我有一个带有 NSTimer 的 iPhone 应用程序,名为 pressTimer,每当有人触摸此按钮时,该应用程序就会关闭。问题是他们经常触摸按钮,我希望计时器在他们抬起手指时停止。因此,我在 .
session 失效意味着 session 销毁。所以如果 session 被销毁,则表明服务器无法识别之前访问过的客户端。因此现在它为该客户端创建一个新的 session ID。 这是正确的吗?如果
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我在尝试缓存 WebClient 返回的 Mono 时遇到问题。代码是这样的: public Mono authenticate() { return cachedTokenMono = ca
我知道通过在 DD-web.xml 文件中设置超时期限来使 session 失效,但我想知道如何以编程方式使 session 失效? 最佳答案 不确定你是否用java编程,但是部署描述符web.xml
我在 2 个不同的服务器上有 2 个应用程序 - Tomcat(基本上是一个 .WAR 文件)和一个在 jBoss 中的 EAR。 EAR 是一个可重复使用的应用程序,我将在其中对用户进行身份验证并将
self.timerProgress=[NSTimer scheduledTimerWithTimeInterval:50.0 target:self selector:@selector(stopP
在我的应用程序中,我应该使用多个计时器,但我不想为每个函数添加单独的计时器,我如何创建一个函数来简化创建多个计时器的过程,我尝试了下面的这段代码,它可以工作,但我不能使计时器无效。 import UI
我在 Swift 中做了一个练习项目来学习 NSTimer 是如何工作的。一键启动定时器,一键取消定时器。当我点击每个按钮一次时它工作正常。但是,当我多次点击开始计时器按钮时,我无法再使其无效。 这是
我在清理事件时遇到一个问题。当我从应用程序注销时,我可以执行清理事件以及 session.invalidate()。但是,当我关闭浏览器选项卡或关闭浏览器时,我无法进行干净的事件。我已经为此阅读了很多
我在 7.1.1 的 Google Pixel 设备上进行测试,发现当所有指纹从设备上移除时,我的私钥并未失效。我已经按照演示应用程序使用单个对称 SecretKey 进行了测试并且按预期工作,但是使
我正在 Tomcat 中运行一个 J2EE Web 应用程序,最近我的任务是向该应用程序添加指标。我正在使用 SessionListener 来检测 session 何时被销毁,然后将指标上传到数据库
我通过右键单击项目 -> 应用程序 -> 程序集信息 -> 标题修改了我的 C# 应用程序名称。 如果应用程序已经安装,则它不会更新名称,因为它正在从未刷新的 MUICache 中提取应用程序名称。
我正在使用 AssetsLibrary 框架将 Assets 保存到特定相册 (ALAssetsGroup)。 由于我经常使用 ALAssetsGroup(用于我想保存 Assets 的专辑),我认为
我的应用程序中有 4 个 NSTimers 对象,它们每隔几秒就会向一个 rest URL 发出请求。 点击一个特定的按钮我想停止计时器,这样它就停止轮询,点击另一个按钮我想恢复轮询。 我已经为所有计
我正在开发一个使用 JWT token 身份验证的 API。我在其背后创建了一些逻辑来使用验证码等更改用户密码。 一切正常,密码已更改。但这里有一个问题:即使用户密码已更改并且我在验证时获得了新的 J
我是一名优秀的程序员,十分优秀!