草庐IT

Synchronized

全部标签

java - 如何检测死锁?同步块(synchronized block)超时?

我正在调试一个运行多个线程的Java应用程序。查看日志一段时间后,似乎其中一个线程不再运行。我的猜测是线程正在等待一个永远不会释放的锁(最后的输出是在调用同步方法之前)。我可以为线程配置超时吗?一种“等待这个锁,但如果10秒后它不可用,就不要再等了!” 最佳答案 您可以使用java.util.concurrent.Lock而不是固有的Object锁。RentrantLock没有公平排序具有与内在锁相同的基本行为和语义。有一种方法tryLock需要一个超时参数:Locklock=...;if(lock.tryLock(10L,Time

Java:引用同步对象是否需要 volatile/final?

这似乎是一个非常基本的问题,但我找不到明确的确认。假设我有一个正确同步的类:publicclassSyncClass{privateintfield;publicsynchronizedvoiddoSomething(){field=field*2;}publicsynchronizedvoiddoSomethingElse(){field=field*3;}}如果我需要对那个类的实例有一个引用,并在线程之间共享,我仍然需要声明那个实例是volatile或final,我说得对吗?如:publicclassMainClass{//previouslyOuterClasspublicsta

面试官:synchronized 能不能禁止指令重排序?大部分人都会答错!

指令重排序1、问题描述首先一定要明确:指令重排序和有序性是不一样的。这一点非常重要。我们经常都会这么说:volatile能保证内存可见性、禁止指令重排序但是不能保证原子性。synchronized能保证原子性、可见性和有序性。注意:这里的有序性并不是代表能禁止指令重排序。举个例子:在双重检查的单例模式中,既然已经加了synchronized为什么还需要volatile去修饰变量呢?如果synchronized能禁止指令重排,那么完全可以不用要volatile。推荐一个开源免费的SpringBoot实战项目:https://github.com/javastacks/spring-boot-be

java - 同步,何时使用或不使用?

我已经开始学习Java中的并发和线程。我知道同步的基础知识(即它的作用)。从概念上讲,我理解它在Java中提供了对具有多个线程的共享资源的互斥访问。但是当面对像下面这样的例子时,我对让它同步是否是个好主意感到困惑。我知道代码的关键部分应该同步,这个关键字不应该被过度使用,否则会影响性能。publicstaticsynchronizedListsortA(AClass[]aArray){ListaObj=getList(aArray);Collections.sort(aObj,newAComparator());returnaObj;}publicstaticsynchronizedL

java - 使用 Actors 而不是 `synchronized`

每次我读到有关在Scala中使用synchronized时,作者通常会提到应该使用Actors(例如this)。虽然我大致了解actors是如何工作的,但我真的很想看到一个使用actors来替换Java的synchronized方法修饰符的示例(我指的是它的Scala等价物-synchronizedblock)在一段代码中。例如,修改数据结构的内部结构会很不错。这是对Actors的良好使用还是我被误导了? 最佳答案 1)概述ScalaActors可以替代标准Java线程应用程序中的复杂业务逻辑,这通常会避开开发人员在复杂的多线程系统

java - 两个线程如何为 "in"一个 "synchronized"的方法

我真的是Java并发的新手,我正在尝试实现以下规范:我们有一个parking场,里面有一些parking位每辆车都表示为一个线程,它不断地改变汽车状态,从驾驶-parking。每辆车都有自己的parking位。当汽车处于parking状态时,它会尝试停在一个地点(不需要他的地点)。如果该parking位空闲,则它会parking,否则它将跳过这个parking阶段并返回驾驶。除非车主想parking,否则汽车会留在原地。这不是确切的规范,但我遇到的唯一问题如下:我无法让汽车跳过转弯。如果两辆车选择了相同的位置,则一辆停放,另一辆等待直到parking场空闲。这不是我想要的行为。我的第一

java - 将 synchronized() 与 ReentrantLock.lock() 混合使用

在Java中,ReentrantLock.lock()和ReetrantLock.unlock()是否使用与synchronized()相同的锁定机制?我的猜测是“不”,但我希望是错误的。例子:假设线程1和线程2都可以访问:ReentrantLocklock=newReentrantLock();线程1运行:synchronized(lock){//blah}线程2运行:lock.lock();try{//blah}finally{lock.unlock();}假设线程1先到达它的部分,然后在线程1完成之前线程2:线程2会等待线程1离开synchronized()block,还是会继续

java - 基本类型是易变的还是同步的?

在Java中,如果变量的大小小于或等于32位,则赋值是原子的,但如果大于32位,则不是。在双赋值或长赋值的情况下,使用什么(volatile/synchronized)会更​​有效?喜欢,volatiledoublex=y;同步不适用于原始参数。在这种情况下如何使用同步?当然我不想锁定我的类(class),所以不应该使用this。 最佳答案 你想做什么?synchronized和volatile关键字是Java中的机制,可用于确保读取相同数据的不同线程观察到一致的值。特别是它们允许您推理程序中的先行关系。您无法避免使用volatil

java - 您可以安全地同步 Java 方法参数吗?

拿这段代码:publicclassMyClass{privatefinalObject_lock=newObject();privatefinalMyMutableClass_mutableObject=newMyMutableClass()publicvoidmyMethod(){synchronized(_lock){//wearesynchronizingoninstancevariable_lock//dosomethingwithmutableVar//(i.e.calla"set"methodon_mutableObject)}}}现在,想象一下将myMethod()中的代

java - 线程互斥段

你好,我刚刚接受了电话采访,我无法回答这个问题,我想知道答案,我相信,最好是联系你不知道的答案。请鼓励我理解这个概念。他的问题是:“同步块(synchronizedblock)一次只允许一个线程进入互斥段。当一个线程退出synchronizedblock时,synchronizedblock没有指定接下来允许哪个等待线程进入互斥部分?使用Object中可用的synchronized和方法,你能实现先到先得,先发互斥节?一种保证让线程进入互斥段按到达顺序?"publicclassTest{publicstaticfinalObjectobj=newObject();publicvoidd