Tag: 线程安全

在Java中同步String对象

我有一个web应用程序,我正在做一些负载/性能testing,特别是一个function,我们期望有几百个用户访问同一个页面,每10秒刷新一次。 我们发现使用这个函数可以改进的一个方面是caching来自Web服务一段时间的响应,因为数据没有变化。 在实现了这个基本的caching之后,在一些进一步的testing中,我发现我没有考虑到并发线程如何能够同时访问Cache。 我发现,在大约100ms的时间内,大约有50个线程试图从Cache中获取对象,发现它已经过期,敲击Web服务来获取数据,然后将对象放回到caching中。 原来的代码看起来像这样: private SomeData[] getSomeDataByEmail(WebServiceInterface service, String email) { final String key = "Data-" + email; SomeData[] data = (SomeData[]) StaticCache.get(key); if (data == null) { data = service.getSomeDataForEmail(email); StaticCache.set(key, data, CACHE_TIME); } else { logger.debug("getSomeDataForEmail: using cached object"); } return data; } 所以,为了确保只有一个线程在key对象过期时调用Web服务,我想我需要同步Cache的get / set操作,而且好像使用caching密钥将是一个很好的候选对象(通过这种方式,对电子邮件b@b.com的调用不会被对a@a.com的方法调用阻止)。 我更新了这个方法: private SomeData[] getSomeDataByEmail(WebServiceInterface service, String […]

快速执行和线程安全的可观察收集

ObservableCollection会为每个对其执行的操作提出通知。 首先,他们没有批量添加或删除调用,其次他们不是线程安全的。 这不会让他们变慢吗? 不能我们有一个更快的select? 有人说ICollectionView缠绕在ObservableCollection上的速度很快吗? 这个说法多么真实 ?

线程安全与重入

最近,我问了一个问题,题目是“malloc线程安全吗? ,在里面我问:“malloc是可重入的吗? 我的印象是所有重入者都是线程安全的。 这个假设是错误的吗?

我们是否应该使用EventQueue.invokeLater来处理Java桌面应用程序中的任何GUI更新?

我知道通过使用这个方法,runnable参数被提交给系统EventQueue。 但是,所有的GUI更新都应该使用这种方法来完成? 我的意思是,如果我想说,更改JButton的文本,我应该使用这样的东西: java.awt.EventQueue.invokeLater(new Runnable() { public void run() { jButton1.setText("changed text"); } }); 如果我应该使用这种方法,我们可以使用任何模式来避免这个重复的代码?

C#数组是否线程安全?

尤其是 创build一个函数来获取一个数组和一个索引作为参数。 创build一个元素数组。 创build一个计数循环。 在新线程的循环内部,使用传入的索引器将对象的新实例分配给数组。 我知道如何pipe理线程等。我有兴趣知道这是否是线程安全的做某事。 class Program { // bogus object class SomeObject { private int value1; private int value2; public SomeObject(int value1, int value2) { this.value1 = value1; this.value2 = value2; } } static void Main(string[] args) { var s = new SomeObject[10]; var threads = Environment.ProcessorCount – 1; var stp = new […]

-pthread和-lpthread在编译时的区别

编译multithreading程序时使用的gcc -pthread和gcc -lpthread有什么区别?

DbContext线程安全吗?

我想知道是否DbContext类是线程安全的,我假设它不是,因为我目前正在执行DbContext线程访问我的应用程序中的DbContext ,我得到了一大堆的lockingexception和其他东西看起来像他们可能是线程有关。 直到最近我没有得到任何错误…但直到最近我没有访问线程中的DbContext 。 如果我是对的,人们会提出什么样的解决scheme?

HttpSession线程安全吗,set / get属性线程安全操作?

此外,被设置的对象是否必须是线程安全的,以确保我们知道存储在会话中的对象的状态是已知的。 另外,我正在网上阅读一些build议使用: synchronized(session) { session.setAttribute("abc", "abc"); } 这是一个有效的build议?

Java同步方法locking对象或方法?

如果我在同一个类中有两个同步方法,但是每个访问不同的variables,两个线程可以同时访问这两个方法吗? 锁是在对象上发生的,还是与synchronized方法中的variables一样具体? 例: class X { private int a; private int b; public synchronized void addA(){ a++; } public synchronized void addB(){ b++; } } 2个线程可以同时访问X类的同一个实例x.addA( )和x.addB()吗?

什么是可重入函数?

大多数 时候 ,再入的定义是从维基百科引用的: 如果一个计算机程序或例行程序在其先前的调用完成之前可以被安全地调用(即,它可以被安全地同时执行),则被描述为可重入的。 重新计算机程序或程序: 不得包含静态(或全局)非常量数据。 不得将地址返回到静态(或全局)非常量数据。 只能在由调用者提供给它的数据上工作。 不能依靠锁来单身资源。 不得修改自己的代码(除非在自己的唯一线程存储中执行) 不得调用非重入式计算机程序或例程。 如何安全地定义? 如果一个程序可以同时安全执行 ,是否意味着它是可重入的? 提到的六点之间的共同点是什么,我应该记住,检查我的代码重入能力? 也, 所有recursion函数都是可重入的吗? 所有线程安全函数都是可重入的吗? 所有recursion和线程安全的函数都是可重入的吗? 在写这个问题的时候,想到的一点是:像再进入和线程安全这样的术语是绝对的,它们是否有固定的具体定义? 因为,如果不是,这个问题不是很有意义。