我正在开发一个Android应用程序。 我想用服务器上的MySQL数据库更新本地的SQLite数据库。 我无法弄清楚什么是最合适和标准化的方式呢?
我有一个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 […]
我们什么时候应该使用互斥量,什么时候应该使用信号量?
asynchronous调用和非阻塞调用有什么区别? 还有阻塞和同步调用(请举例)?
我认为两者都在做同样的工作,你如何决定使用哪一个同步?
假设你维护一个公开函数getData的库。 您的用户称之为获取实际数据: var output = getData(); 数据保存在文件中,所以你使用Node.js内置的fs.readFileSync来实现getData 。 很显然, getData和fs.readFileSync都是同步函数。 有一天,您被告知将底层数据源切换到一个只能asynchronous访问的回购库(如MongoDB)。 你也被告知要避免让用户streamgetData , getData API不能改变只返回一个promise或者需要一个callback参数。 你如何满足这两个要求? 使用callback / promise的asynchronous函数是JavasSript和Node.js的DNA。 任何不平凡的JS应用程序可能渗透了这种编码风格。 但这种做法很容易导致所谓的厄运callback金字塔。 更糟糕的是,如果调用链中的任何调用者的代码都依赖于asynchronous函数的结果,那么这些代码也必须被包装在callback函数中,并且对调用者施加编码风格约束。 有时我会发现需要将asynchronous函数(通常在第三方库中提供)封装到同步函数中,以避免大规模的全局重构。 在这个主题上寻找解决scheme通常最终会得到Node Fibers或npm包。 但纤维丝毫无法解决我所面临的问题。 即使Fibers的作者提供的例子也说明了这一缺陷: … Fiber(function() { console.log('wait… ' + new Date); sleep(1000); console.log('ok… ' + new Date); }).run(); console.log('back in main'); 实际产出: wait… Fri Jan 21 2011 22:42:04 GMT+0900 (JST) back […]
可能重复: 在java中增加锁的数量的最佳方法是什么? 假设我想locking一个整数id值。 在这种情况下,有一个函数从caching中提取值,如果值不存在,则执行相当昂贵的检索/存储。 现有代码不同步,可能会触发多个检索/存储操作: //psuedocode public Page getPage (Integer id){ Page p = cache.get(id); if (p==null) { p=getFromDataBase(id); cache.store(p); } } 我想要做的是同步ID上的检索,例如 if (p==null) { synchronized (id) { ..retrieve, store } } 不幸的是,这不会工作,因为2个独立的调用可以有相同的Integer id值,但是一个不同的Integer对象,所以他们不会共享锁,并且不会发生同步。 有一个简单的方法来确保你有相同的Integer实例吗? 例如,这个工作: syncrhonized (Integer.valueOf(id.intValue())){ Integer.valueOf()的javadoc似乎意味着你可能会得到相同的实例,但是这看起来不是一个保证: 返回表示指定的int值的Integer实例。 如果不需要新的Integer实例,则通常应优先使用此方法,而不是构造函数Integer(int),因为通过caching频繁请求的值,此方法可能会产生显着更好的空间和时间性能。 所以,关于如何获得保证相同的Integer实例的任何build议,除了更复杂的解决scheme,如保持Lock对象的WeakHashMap键入int? (没有什么不对的地方,这似乎是必须有一个明显的一行,而不是我失踪)。
我正在使用静态代码块来初始化我在registry中的一些控制器。 所以我的问题是,我可以保证,这个静态代码块将只会被绝对调用一次,当第一次加载类? 我知道我不能保证什么时候这个代码块将被调用,我猜它是什么时候Classloader第一次加载它。 我意识到我可以在静态代码块的类上同步,但我的猜测是这实际上是什么发生呢? 简单的代码示例是; class FooRegistry { static { //this code must only ever be called once addController(new FooControllerImpl()); } private static void addController(IFooController controller) { // … } } 或者我应该这样做; class FooRegistry { static { synchronized(FooRegistry.class) { addController(new FooControllerImpl()); } } private static void addController(IFooController controller) { // … } }
我知道在一个方法为该对象带来同步之前使用synchronize关键字。 也就是说,运行同一个对象实例的2个线程将被同步。 但是,由于同步处于对象级别,因此运行不同对象实例的2个线程将不会同步。 所以,如果我们在方法调用的java类中有一个静态variables,我们希望它在类的实例间同步。 这两个实例在两个不同的线程中运行。 我们可以通过以下方式实现同步吗? 公共类testing { private static int count = 0; private static final Object lock = new Object(); public synchronized void foo() { 同步(locking) { 计数++; } } } 是否真的,因为我们已经定义了一个静态的对象“锁”,并且我们正在使用该锁的关键字synchronized,所以静态varibale计数现在可以在类Test的实例间同步了?
我是新来的multithreading,并试图了解互斥体如何工作。 有很多谷歌search, 我find了一个体面的教程 ,但它仍然留下了一些工作,因为我创build了自己的程序,其中locking不起作用的怀疑。 一个绝对不直观的互斥语法是pthread_mutex_lock( &mutex1 ); ,它看起来像互斥体被locking,当我真正想locking的是其他一些variables。 这个语法是否意味着locking一个互斥锁,locking一段代码,直到互斥锁被解锁? 那么线程怎么知道这个区域被locking? [ 更新:线程通过 内存屏蔽 知道该区域被locking ]。 而不是这样的现象应该被称为临界区? [ 更新:临界区对象仅在Windows中可用,其中对象比互斥体快,只有实现它的线程才可见。 否则,关键部分只是指由互斥体保护的代码区域 ] 简而言之,能否请您介绍一下最简单的互斥示例程序以及关于它如何工作的逻辑的最简单可能的解释 ? 我相信这会帮助其他许多新手。