Tag: 同步

同步不同步

synchronized似乎没有像我预期的那样工作。 它不应该使得括号内的代码相对于由同一对象synchronized的单独代码块而言是primefaces的吗? 我发现它在我的代码中根本没有同步。 private Object movementMutex_ = new Object(); // Thread public void run() { while (run_) { synchronized(movementMutex_) { if (timeToMove_) { Log.v(“meh”, “timeToMove_ was true, moving”); makeMove(); Log.v(“meh”, “Move Complete. Setting timeToMove_ to false”); timeToMove_ = false; Log.v(“meh”, “timeToMove_ is now false”); } } } } // Called by a different thread so […]

java同步和exception处理

如果我有一个synchronized块并且在该块内的某个地方抛出了一个未在synchronized块中捕获的exception,那么当exception传播出来时是否会放弃锁定?(synchronized块) synchronized( mutex ) { throw new Exception( “” ); }

将Java虚拟机与System.nanoTime同步

将java虚拟机与System.nanoTime()同步是否有意义? 我的意思是 : 调用System.nanoTime()并将结果放入t1 A向B发送数据包 当在B上接收到来自A的数据包时,B调用System.nanoTime()并将结果发送给A. 当在A上接收到来自B的数据包时,A调用System.nanoTime()并将结果放入t3,将来自B的数据包中接收的时间放在t2中 timeshift =(t3-t1)/ 2-t2 使用System.nanoTime来做到这一点是正确的吗? 谢谢 !

使用AtomicInteger作为静态共享计数器

为了通过Java了解同步,我只是搞乱一些简单的事情,比如创建线程之间共享的计数器。 我遇到的问题是我无法弄清楚如何在100%的时间内顺序打印计数器。 int counterValue = this.counter.incrementAndGet(); System.out.println(this.threadName + “: ” + counterValue); 上面增加AtomicInteger counter ,获取新值,并将其打印到由负责该更新的线程名称标识的控制台。 当看起来incrementAndGet()方法在打印当前线程的更新值之前导致JVM上下文切换到另一个线程以进行更新时,会出现问题。 这意味着在线程返回执行状态之前,该值会增加但不会打印。 在查看此示例输出时,这很明显: Thread 3: 4034 Thread 3: 4035 Thread 3: 4036 Thread 1: 3944 Thread 1: 4037 Thread 1: 4039 Thread 1: 4040 Thread 2: 3863 Thread 1: 4041 Thread 1: 4043 您可以看到,当执行返回到线程1时,它会打印其值并继续更新。 线程2也是如此。 我有一种感觉,我错过了一些非常明显的东西。

java中的时间同步

在for-loop中,我通过检索和处理车辆信息来控制基于模拟步骤的交通模拟器SUMO。 为了确保我的程序在“实时”模拟(1个模拟步骤= 1秒),我想在处理阶段之后睡眠我的程序,直到下一个时间步骤开始。 为了获得更好的结果,我正在根据最初采用的参考时间戳计算时间戳。 循环看起来像这样: System.out.println(“start of traffic simulation …”); for (int i = 0; i < stepCount; i++) { System.out.println("step: " + i); // set before timeStamp beforeTimeStamp = System.currentTimeMillis(); if (firstStep) { // get reference timeStamp referenceTimeStamp = beforeTimeStamp; firstStep = false; } else { // get next vehicleVector vehicleVector = masterControl.traCIclient.simulateStep(); } […]

Java中的多个对象锁?

锁定私有字段变量(而不是使用锁定对象)是安全/可接受的做法吗? 这样,我可以有不同的锁用于不同的目的。 示例如下: class Test { private Integer x = 0; private Integer y = 0; public void incrementX() { synchronized(x) { x++; } } public void decrementX() { synchronized(x) { x++; } } public void incrementY() { synchronized(y) { y++; } } public void decrementY() { synchronized(y) { y++; } } 或者我应该为每个想要锁定的私人会员拥有一个锁定对象? 例: class […]

同步代码比非同步代码执行速度更快

我出来了这个惊人的结果,我绝对不知道原因:我有两种方法缩写为: private static final ConcurrentHashMap mapBoolean = new ConcurrentHashMap(); private static final ConcurrentHashMap<Double,LinkedBlockingQueue> map = new ConcurrentHashMap<Double, LinkedBlockingQueue>(); protected static Future execute(final Double id, Callable call){ // where id is the ID number of each thread synchronized(id) { mapBoolean.get();// then do something with the result map.get();//the do somethign with the result } } protected static […]

多个实例时Servlet同步

我已经读过servlet中的代码可以与synchronized块同步。 但是,我还读到虽然servlet容器通常只有一个servlet实例,但它可以保留一个实例池。 当然这意味着同步块不能保证工作,因为您不知道请求线程将选择哪个实例?

Java在线程启动之前发生

我读到某个地方,开始一个线程对关系之前发生的事情有一些特殊的影响。 现在我不确定我的代码是否保证在关系之前发生的事情,所以请赐教。 我有一个Dispatcher线程和一个实现Runnable接口的Worker类。 Dispatcher线程创建Worker的新实例,并通过带元素的add方法填充Worker实例中的LinkedList 。 然后,Dispatcher通过execute方法将Worker实例交给ExecutorService 。 然后,Worker类中的run方法开始从LinkedList访问和删除东西。 新启动的Worker实例是否看到与Dispatcher一样的LinkedList状态? 或者可能是LinkedList处于某种不一致的状态? 我是否必须在同步方法中填充LinkedList ?

同步与ReadWriteLock性能

我试图certificate当有许多读者和只有一些作者时,synchronized会更慢。 不知怎的,我certificate了相反。 RW示例,执行时间为313 ms: package zad3readWriteLockPerformance; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; public class Main { public static long start, end; public static void main(String[] args) { Runtime.getRuntime().addShutdownHook(new Thread(() -> { end = System.currentTimeMillis(); System.out.println(“Time of execution ” + (end – start) + ” ms”); })); start = System.currentTimeMillis(); […]