所以我已经阅读过,而不是直接调用事件
if (SomeEvent != null)
SomeEvent(this, null);
Run Code Online (Sandbox Code Playgroud)
我应该这样做
SomeEventHandler temp = SomeEvent;
if (temp != null)
temp(this, null);
Run Code Online (Sandbox Code Playgroud)
为什么会这样?第二个版本如何变得线程安全?什么是最佳做法?
有时我会看到术语"自由线程"来描述一个类或一个方法.它似乎与"线程安全"具有相似或相同的含义.
这两个术语有区别吗?
我必须在许多线程中并行打印许多格式化的十进制值.要格式化十进制值,我使用java.text.DecimalFormat由模式配置.我知道来自java doc的警告DecimalFormat:
十进制格式通常不同步.建议为每个线程创建单独的格式实例.如果多个线程同时访问格式,则必须在外部进行同步.
但我不知道这个警告是否适用于我的场景:我java.text.DecimalFormat在应用程序启动时配置一次(并将其存储Formatter在最终字段中).之后我只使用这个format(double)方法.
我想这样做的原因是:DecimalFormat每次我需要打印格式化的数字时,我不想通过创建新实例来失去性能.
我查看了DecimalFormat.format(double)代码,它看起来是线程安全的,但我不确定.
DecimalFormat.format(double)在没有改变格式化程序的配置时,你能否确认最终的线程是否安全,或解释为什么不是?
可以说我们有这两个示例代码:
public synchronized void getSomething(){
this.hello = "hello World";
}
Run Code Online (Sandbox Code Playgroud)
还有这个
public void getSomething(){
synchronized(this){
this.hello = "hello World";
}
}
Run Code Online (Sandbox Code Playgroud)
所以有人可以告诉我现在的区别是什么?
我搜索并发现不可变是线程安全而可变不是.这可以.但是我得到了误导性的注释,博客,关于线程安全的原子与非原子的答案,请给出答案的解释.
假设有一个名为"name"的原子字符串属性,如果[self setName:@"A"]从线程A调用,[self setName:@"B"]从线程B调用,并[self name]从线程C 调用,则不同线程上的所有操作将串行执行,这意味着如果一个线程正在执行setter或getter,然后其他线程将等待.这使得属性"name"读/写安全,但如果另一个线程D [name release]同时调用,则此操作可能会导致崩溃,因为此处不涉及setter/getter调用.这意味着对象是读/写安全(ATOMIC)但不是线程安全的,因为另一个线程可以同时向对象发送任何类型的消息.
如果属性"name"是非原子的,那么上面例子中的所有线程--A,B,C和D将同时执行,产生任何不可预测的结果.在原子的情况下,A,B或C中的任何一个将首先执行,但D仍然可以并行执行.
你对此的评论将有助于我们......
而我的问题是,"这在可可,原子或非原子中是线程安全的吗?"
我知道如果我有多个线程调用putStrLn而没有任何类型的并发控制,那么线程的输出可能是交错的.
我的问题是putStrLn这个交错输出是否是线程安全的模数?
我假设这putStrLn是一个缓冲的写操作,所以我真的在问两个线程同时调用是否会导致输出缓冲区的任何损坏putStrLn.
一般来说,关于Haskell(真正的GHC)其他"标准I/O"功能的线程安全性可以说些什么呢?特别是,对于任何缓冲的读操作,是否可以将相同的字符返回到两个不同的线程同时进行相同的读取调用?
我在我的应用程序中使用Redis,包括Sidekiq队列和模型缓存.
考虑到将从我的Web应用程序(通过Puma运行)和Sidekiq内部的后台作业调用将要访问Redis的模型,我的模型可以使用Redis连接的最佳方法是什么?
我目前在我的初始化器中执行此操作:
Redis.current = Redis.new(host: 'localhost', port: 6379)
Run Code Online (Sandbox Code Playgroud)
然后在整个代码中使用Redis.current.get/ Redis.current.set(和类似的)...
据我所知,这应该是线程安全的,因为Redis客户端只使用Monitor一次运行一个命令.
现在,Sidekiq拥有自己的Redis连接池,并建议这样做
Sidekiq.redis do |conn|
conn.get
conn.set
end
Run Code Online (Sandbox Code Playgroud)
据我所知,这比使用Redis.current的方法更好,因为当他们命中Redis时,多个线程上没有多个工作线在一个连接上互相等待.
但是,如何才能将我从Sidekiq.redis获得的连接提供给我的模型?(无需在每个方法调用中将其作为参数传递)
我无法在该块中设置Redis.current,因为它是全局的,并且我回到每个人使用相同的连接(以及它们之间随机切换,甚至可能是非线程安全的)
我应该将从Sidekiq.Redis获得的连接存储到Thread-local变量中,并在任何地方使用该线程局部变量?
在这种情况下,我在"Puma"环境中做了什么?如何设置线程局部变量?
对此有任何想法非常感谢.
谢谢!
我有一个C++应用程序,它由非托管C++,托管C++和c#组成.在非托管部分,我正在尝试使用std :: mutex创建一个线程安全集合.
但是,当我使用互斥锁时,我收到以下错误;
错误C1189:使用/ clr或/ clr:pure进行编译时不支持#error:<mutex>.
知道为什么我不能使用互斥锁吗?有人可以推荐替换它,以便我可以创建一个线程安全的非托管集合吗?
如果你使用Spring MVC的,必须在组件类(@Controller,@Service,@Repository)是线程安全的吗?
也就是说,如果我有一个@RequestMapping方法@Controller,可以通过多个线程同时为同一个控制器对象调用该方法吗?
(之前有人问过这种情况,但没有这样回答).