我有一个非常简单的问题:
是否还是无法充气视图(不将它添加到布局)在后台线程(例如:在doInBackground的AsyncTask)?
我知道这是可能的,因为我已经在我的应用程序中以这种方式实现了大多数活动并且从未出现过问题,直到我在Galaxy S上遇到此问题: Android:android.view.InflateException:二进制XML文件行#13:错误在SAMSUNG Galaxy S中膨胀类<未知>
我被告知我不应该Views在后台线程中膨胀,但具体原因是什么,为什么我的aproach在大多数设备中工作但在Galaxy S中没有?
我遇到过这一行"有些功能本质上是线程安全的,例如memcpy()"
维基百科将"线程安全"定义为:
如果一段代码仅以保证多个线程同时安全执行的方式操作共享数据结构,则它是线程安全的.
好.但本质上意味着什么呢?它与继承有关吗?
Nutshell中的C#4(强烈推荐的btw)使用以下代码来演示MemoryBarrier的概念(假设A和B在不同的线程上运行):
class Foo{
int _answer;
bool complete;
void A(){
_answer = 123;
Thread.MemoryBarrier(); // Barrier 1
_complete = true;
Thread.MemoryBarrier(); // Barrier 2
}
void B(){
Thread.MemoryBarrier(); // Barrier 3;
if(_complete){
Thread.MemoryBarrier(); // Barrier 4;
Console.WriteLine(_answer);
}
}
}
Run Code Online (Sandbox Code Playgroud)
他们提到障碍1和4阻止这个例子写0和障碍2和3提供新鲜度保证:他们确保如果B在A之后运行,读_complete将评估为真.
我不是真的得到它.我想我明白为什么壁垒1和4是必要的:我们不想在写_answer进行优化,并放置在写后_complete(屏障1),我们需要确保_answer没有被缓存(光栅4) .我也认为我理解为什么Barrier 3是必要的:如果A在写完_complete = true之后才运行,B仍然需要刷新_complete以读取正确的值.
我不明白为什么我们需要障碍2!我的一部分说这是因为可能线程2(运行B)已经运行直到(但不包括)if(_complete),因此我们需要确保_complete被刷新.
但是,我不知道这有多大帮助.是不是仍然可以在A 中将_complete设置为true但是B方法会看到_complete的缓存(错误)版本?即,如果线程2运行方法B直到第一个MemoryBarrier之后,然后线程1运行方法A直到_complete = true但没有进一步,然后线程1恢复并测试是否(_complete) - 如果不导致错误 …
c# multithreading thread-safety shared-memory memory-barriers
遗憾的是,MemoryCache.Set的MSDN文档没有明确说明它是否是线程安全的.
是否可以安全地使用.Get()并且.Set()没有显式锁定的几个线程?
我正在尝试在C#中创建线程安全属性,我想确保我在正确的路径上 - 这就是我所做的 -
private readonly object AvgBuyPriceLocker = new object();
private double _AvgBuyPrice;
private double AvgBuyPrice
{
get
{
lock (AvgBuyPriceLocker)
{
return _AvgBuyPrice;
}
}
set
{
lock (AvgBuyPriceLocker)
{
_AvgBuyPrice = value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
阅读这篇文章,似乎这不是正确的做法 -
但是,这篇文章似乎暗示,
http://www.codeproject.com/KB/cs/Synchronized.aspx
有没有人有更明确的答案?
编辑:
我想为此属性执行Getter/Setter的原因是b/c我实际上希望它在设置时触发事件 - 所以代码实际上就像这样 -
public class PLTracker
{
public PLEvents Events;
private readonly object AvgBuyPriceLocker = new object();
private double _AvgBuyPrice;
private double AvgBuyPrice
{
get
{
lock (AvgBuyPriceLocker)
{
return _AvgBuyPrice;
}
}
set …Run Code Online (Sandbox Code Playgroud) Java中的原始数据类型是int&shortthread-safe吗?我已执行以下代码,有时无法看到预期的结果500.
public class SampleThree extends Thread
{
static long wakeUpTime = System.currentTimeMillis() + (1000*20);
static int inT;
public static void main(String args[])
{
System.out.println("initial:" + inT);
for(int i=0; i<500; i++)
new SampleThree().start();
try {
Thread.sleep(wakeUpTime - System.currentTimeMillis() + (1000*30));
System.out.println("o/p:" + inT);
}
catch(Exception e){
e.printStackTrace();
}
}
public void run()
{
try {
long s = wakeUpTime - System.currentTimeMillis();
System.out.println("will sleep ms: " + s);
Thread.sleep(s);
inT++; // System.out.println(inT);
}
catch(Exception e) {
e.printStackTrace();
} …Run Code Online (Sandbox Code Playgroud) ...应禁止用户通过禁用任何适当的控件来编辑该首选项.
该NSUserDefaults的类是线程安全的.NSURL和文件引用URL的持久性......
这个长时间的讨论说它不是
http://www.cocoabuilder.com/archive/cocoa/155227-nsuserdefaults-thread-safety.html
那么哪一个是对的?也为什么意见分歧.
使用哪种同步方法来确保单例仍然是单例?
+(Foo*)sharedInstance
{
@synchronized(self)
{
if (nil == _sharedInstance)
{
_sharedInstance = [[Foo alloc] init];
...
}
}
return _sharedInstance;
}
Run Code Online (Sandbox Code Playgroud)
还是使用互斥?
#import <pthread.h>
static pthread_mutex_t _mutex = PTHREAD_MUTEX_INITIALIZER;
+(Foo*)sharedInstance
{
pthread_mutex_lock(&_mutex);
if (nil == _sharedInstance)
{
_sharedInstance = [[Foo alloc] init];
...
}
pthread_mutex_unlock(&_mutex);
return _sharedInstance;
}
Run Code Online (Sandbox Code Playgroud)
嗯..对此有何评论?
singleton multithreading memory-management objective-c thread-safety
客户端实例是昂贵的资源.建议重新使用已配置的实例来创建Web资源.Web资源的创建,请求的构建和响应的接收都保证是线程安全的.因此,可以在多个线程之间共享Client实例和WebResource实例
我有一段代码,可以在两个线程中更改一个计数器。它不是线程安全的,因为我没有在代码中放置任何原子变量或锁。如果代码仅运行一次,它会给出正确的结果,但是我想运行几次,因此将代码放入for循环中。问题是只有前两个循环会生成我期望的结果。对于其余的循环,结果始终为0,这似乎是线程安全的。Java虚拟机中是否有任何内部运算符导致这种情况?
我尝试过更改循环数,而第一个或第二个总是我期望的,但是无论有多少个循环,其他的都是0。
计数器:
private static class Counter {
private int count;
public void increase() {
count++;
}
public void decrease() {
count--;
}
public int getCount() {
return count;
}
}
Run Code Online (Sandbox Code Playgroud)
人:
// This is just a thread to increase and decrease the counter for many times.
private static class Person extends Thread {
private Counter c;
public Person(Counter c) {
this.c = c;
}
@Override
public void run() {
for (int i = 0; i < 100000; i++) { …Run Code Online (Sandbox Code Playgroud) thread-safety ×10
java ×4
c# ×3
objective-c ×2
.net ×1
android ×1
arrays ×1
c ×1
inflate ×1
jersey ×1
jersey-2.0 ×1
memorycache ×1
primitive ×1
properties ×1
singleton ×1