Tag: 同步

列表中这两个同步用法之间的行为有何不同?

List list = new ArrayList(); list.add(“a”); … list.add(“z”); synchronized(list) { Iterator i = list.iterator(); while(i.hasNext()) { … } } 和 List list = new ArrayList(); list.add(“a”); … list.add(“z”); List synchronizedList = Collections.synchronizedList(list); synchronized(synchronizedList) { Iterator i = synchronizedList.iterator(); while(i.hasNext()) { … } } 具体来说,当同步列表提供对列表的线程安全访问时,我不清楚为什么在第二个实例中需要同步。

Java以单例模式同步

是否需要将synchronize关键字应用于实现单例模式的类的每个方法? public class Singleton { private Singleton(){} public synchronized static Singleton getInstance() { if(instance == null) instance = new Singleton (); return instance; } public void DoA(){ } } 由于Singletons不公开公共构造函数并且getInstance()方法是同步的,因此不需要同步方法DoA和Singleton类公开的任何其他公共方法。 这个推理是否正确?

在Java中,是否需要同步不使用静态或类变量的方法?

仅使用局部变量的方法是否会遇到任何线程问题? 在某处提到过,使用局部变量的方法被复制到每个线程堆栈框架中,除非它使用类级别或静态引用/变量,否则不需要为multithreading实现进行同步?

Java同步HashMap中的size(),put(),remove(),get()是否为primefaces?

我将Java Map声明为 Map map = Collections.synchronizedMap(new HashMap()); 处理并发问题,并在地图上同步其上的所有操作。 但是,我读到当操作是primefaces操作时,synchronizedMap上不需要synchronizedMap 。 我检查了Java API,HashMap的文档似乎没有提到哪些是primefaces的,所以我不确定是哪些。 我正在同步以下对地图的调用: map.size() map.put() map.remove() map.get() 但如果有些是primefaces的,那么似乎并不需要同步。 哪个是primefaces的?

使用带有返回值的同步方法包装一系列异步调用

我当前的代码使用一系列异步进程,最终结果。 我需要以这样的方式包装每一个,每个都通过同步方法访问,结果作为返回值。 我想使用执行程序服务来执行此操作,以便允许许多这些服务同时发生。 我觉得Future可能与我的实现相关,但我无法找到一个很好的方法来实现这一点。 我现在拥有的: public class DoAJob { ResultObject result; public void stepOne() { // Passes self in for a callback otherComponent.doStepOne(this); } // Called back by otherComponent once it has completed doStepOne public void stepTwo(IntermediateData d) { otherComponent.doStepTwo(this, d); } // Called back by otherComponent once it has completed doStepTwo public void stepThree(ResultObject […]

如何检查等待同步方法解锁的线程数

有没有办法检查有多少线程在等待同步方法解锁? 我想知道线程何时调用synchronized方法: 1)已经有多少线程在等待调用该方法? 2)一旦调用该方法需要等待该方法解锁多长时间? 解决方案:我使用堆垛机解决了这个问题: public class LockedClass { public static int count; public static void measuringClass() throws IOException{ long startTime = System.currentTimeMillis(); count++; System.out.println(“Threads waiting=”+count); lockedMethod(startTime); count–; System.out.println(“Threads waiting=”+count); } public static synchronized void lockedMethod(long startTime) throws IOException{ System.out.println(“I spent=”+(System.currentTimeMillis()-startTime)+” in the queue”); Hashtable params = new Hashtable(); params.put(“param1”, “test”); params.put(“param2”, “12345678”); String sessionId […]

同步发布顺序

我扫描了synchronized语句中的所有java 文档 ,寻找这个问题的答案而没有运气。 假设我有thread1 , thread2 , thread3尝试同时运行以下代码。 synchronized(lockObj) { doSomething(); } 假设thread1首先获取doSomething() , thread2然后thread3 ,它将阻塞并等待synchronized语句。 题 当thread1释放锁时,哪个线程将首先释放? 释放锁时适用的一般订单规则是什么?

AtomicBoolean中getAndSet和compareAndSet之间的区别

线程标题应该是自我探索的…我对AtomicBoolean类下面的方法规范有点困惑: java.util.concurrent.atomic.AtomicBoolean#compareAndSet java.util.concurrent.atomic.AtomicBoolean#getAndSet 我的断言是,当在if条件中用作布尔子句时,两者都会产生相同的行为: public class Test { private AtomicBoolean flag = AtomicBoolean(false); public void processSomeAction() { if (flag.getAndSet(false)) { // Shouldn’t this be similar to flag.compareAndSet(false) // process some action } } //… private void internalMutatorMethod() { // do some staff then update the atomic flag flas.set(true); } } 假设我想要检索当前标志值并自动更新它,两个方法是否应该产生相同的行为? 如果我错过了内部差异,我将非常感谢有关如何以及何时使用这些内容的任何解释。

主方法中的同步块

在下面关于线程之间同步的代码中,根据生成的输出,为什么控制被转移到执行新线程,尽管在主方法中为同一对象“dt”获取了锁? public class DemoThread extends Thread { public DemoThread() { } public void run() { int i=0; synchronized(this) { while(++i=2) this.notify(); }catch(InterruptedException ie) { ie.printStackTrace(); System.exit(1); } } } } private static int sum; public static void main(String… args) { DemoThread dt = new DemoThread(); dt.start(); synchronized(dt) { try{ System.out.println(“main here”); dt.wait(); System.out.println(“main here again”); […]

multithreadingJava,但只有一个线程工作

我的Java线程无法独立工作,如何解决? 这是最初的主要内容: Mechanics mechanics = new Mechanics(busShop, “Mechanic 1”); Mechanics mechanics2 = new Mechanics(busShop, “Mechanic 2”); Thread thMechanic = new Thread(mechanics); Thread thMehanic2 = new Thread(mechanics2); thMechanic.start(); thMehanic2.start(); 到目前为止没问题,按预期工作,所以机械师这样做: public void run() { fixEngine(); } private void fixEngine() { while (true) { busShop.FixEngine(MechanicsName); } } 正如此处所见,它可以永久修复引擎,在修复引擎function中: public static List ListBusEngineFix = new LinkedList(); public void […]