Tag: 同步

HashMap缓存中的同步

我有一个人们要求资源的网络应用程序。 为了提高效率,使用同步哈希映射缓存此资源。 这里的问题是当同时为同一个未缓存的资源发出两个不同的请求时:检索资源的操作会占用大量内存,所以我想避免为同一个资源多次调用它。 有人可以告诉我以下代码段是否存在任何潜在问题? 提前致谢。 private Map resources = Collections.synchronizedMap(new HashMap()); public void request(String name) { Resource resource = resources.get(name); if (resource == null) { synchronized(this) { if (resources.get(name) == null) { resource = veryCostlyOperation(name); // This should only be invoked once per resource… resources.put(resource); } else { resource = resources.get(name); } } } … […]

在java中同步 – 正确使用

我正在构建一个在多进程(Threads)中使用的简单程序。 我的问题更多的是要理解 – 当我必须同步使用保留字时? 我是否需要在影响骨骼变量的任何方法中使用此单词? 我知道我可以把它放在任何非静态的方法上,但我想了解更多。 谢谢! 这是代码: public class Container { // *** data members *** public static final int INIT_SIZE=10; // the first (init) size of the set. public static final int RESCALE=10; // the re-scale factor of this set. private int _sp=0; public Object[] _data; /************ Constructors ************/ public Container(){ _sp=0; _data […]

输入监听器应该同步吗?

我在下面发布的示例代码显示了两个类。 一个实现了KeyListener,另一个实现了Runnable,并且每20毫秒就会在一个无限循环中运行。 当按下一个键时,keyChar(以int的forms)用作索引,设置布尔数组的索引为true或false,表示是否按下了键。 同时,进程循环在键数组中搜索其真值或假值,并将true值设置为false,然后打印出char。 我的问题是我是否需要使用锁来访问charArray,因为它在两个线程中使用:进程线程和键侦听器线程。 示例代码: import java.awt.Component; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; public class Input implements KeyListener { public boolean[] charArray; public Input(Component component) { charArray = new boolean[127]; component.addKeyListener(this); } @Override public void keyPressed(KeyEvent e) { (possible synchronization with a lock?) int keyChar = e.getKeyChar(); if (keyChar == 27 || keyChar == 9 || […]

线程同步 – 如何交替执行线程

我一直在尝试使用wait()和notify()来解决涉及线程通信的问题。 基本上我有2个线程T1和T2,我希望它们按以下顺序执行 T1,T2,T1,T2 ……我怎样才能做到这一点? 实际问题:有2个线程T1 – 打印奇数(比如1 – 100)和T2 – 打印偶数(1 – 100)。 现在,输出应该是1,2,3,4,5 …… 100

具有多个对象/锁的Java同步

我想知道是否有一个包或模型可以帮助我解决这个问题。 假设我有3个线程和一堆对象A,B,C,D,E,F T1需要锁A,B T2需要锁B,C,D T3需要锁E,F 在这种情况下,如果T1和T3同时运行就没问题。 此外,T2和T3可以同时运行。 但T1和T2不应该同时运行。 另外,请注意 线程可以获得任意数量的锁,而不仅仅是2.(我看到了一个优雅的解决方案来解决这个问题,但是我不能确定我可以在这里应用它。) 显然,我希望每个线程同时获取所有需要的锁以防止死锁。 如果有人可以指向我支持此用例的程序包,或解决此问题的一些代码片段,请告诉我。 非常感谢。

在AtomicInteger类中实现addAndGet

我正在浏览AtomicInteger类中的addAndGet方法的Java(Java 6)源代码。 相应的代码如下: public final int addAndGet(int delta) { for (;;) { int current = get(); int next = current + delta; if (compareAndSet(current, next)) return next; } } compareAndSet方法调用本机方法来执行赋值。 主要有两个问题: 无限循环如何帮助? 可能是什么情况,“if(compareAndSet(current,next))”条件可能返回false? 在这种情况下,代码可能会遇到无限循环。 如果保证compareAndSet将始终返回“true”,那么我们是否可以完全取消此检查? 类似的疑问是使用decrementAndGet , getAndDecrement , getAndAdd方法。

线程转储被阻止并锁定

这类似于Java线程转储:没有“等待锁定…”的BLOCKED线程 。 基本上,我看到一个BLOCKED线程,但它有等待的锁: “pool-1-thread-60” prio=10 tid=0x00007fbf10017000 nid=0x210 waiting for monitor entry [0x00007fbed64e3000] java.lang.Thread.State: BLOCKED (on object monitor) at org.apache.log4j.Category.callAppenders(Category.java:204) – locked (a org.apache.log4j.Logger) at org.apache.log4j.Category.forcedLog(Category.java:391) at org.apache.log4j.Category.info(Category.java:666) … 我希望看到- waiting to lock …而不是- locked… 另一个问题表明垃圾收集是原因,但如果是这样,那么所有线程都不会被阻塞吗? 还有其他线程是RUNNABLE。 另外,我怎么能certificate这种情况呢? 为什么这是观察到的行为? 我不想盲目地假设它是垃圾收集器只是为了发现几天之后它是别的东西。 ==辅助信息== 虽然我认为它与手头的问题无关,但这是上述转储来自的代码部分。 for(Category c = this; c != null; c=c.parent) { // Protected against simultaneous call […]

什么是synchronized语句用于?

synchronized语句的用法是什么?

通知postgres对java应用程序的更改

问题 我正在为几十万种产品建立一个postgres数据库 。 我将设置一个索引(Solr或ElasticSearch)来改善复杂搜索查询的查询时间。 现在的重点是如何让索引与数据库同步? 在过去, 我有一种应用程序定期轮询数据库以检查应该完成的更新 ,但我会有一个过时的索引状态时间 (从数据库更新到索引更新拉动)。 我更喜欢一种解决方案,其中数据库将通知我的应用程序 (Java应用程序)数据库中的某些内容已被更改,此时应用程序将决定是否需要更新索引。 为了更准确,我将构建一种生产者和消费者结构,希望副本将从postgres接收有关更改的通知,如果这与索引的数据相关,则将其存储在待执行更新的堆栈中。 消费者将使用此堆栈并构建要存储到索引中的文档。 可能的解决方案 一种解决方案是编写一种副本端点 ,其中应用程序将表现为用于复制原始数据库中的数据的postgres实例。 有人对这种方法有一些经验吗? 我对此问题有哪些其他解决方案?

Java notify()在wait()之前运行?

public class ThreadA { public static void main(String[] args){ ThreadB b = new ThreadB(); b.start(); synchronized(b){ try{ System.out.println(“Waiting for b to complete…”); b.wait(); }catch(InterruptedException e){ e.printStackTrace(); } System.out.println(“Total is: ” + b.total); } } } class ThreadB extends Thread{ int total; @Override public void run(){ synchronized(this){ for(int i=0; i<100 ; i++){ total += i; } […]