jjzjj

synchronize

全部标签

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

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

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 同步块(synchronized block),还是使用全局锁?

我有一些代码只允许一个线程访问。我知道如何使用synchronizedblock或方法来完成此操作,但这是否适用于集群环境?目标环境为WebSphere6.0,集群中有2个节点。我觉得synchronized行不通,因为每个节点上的每个应用程序实例都有自己的JVM,对吧?我在这里尝试做的是在系统启动时对数据库记录执行一些更新。它将查找比代码版本更旧的任何数据库记录,并执行特定任务来更新它们。我只希望一个节点执行这些升级,因为我想确保每个工作项只升级一次,并且这些升级的性能不是一个大问题,因为它只发生在应用程序启动时,它只真正做任何事情自上次启动后代码发生更改时。数据库是DB2v9,我是

java - Java中的线程安全类通过同步块(synchronized block)

假设我们有一个非常简单的Java类MyClass。publicclassMyClass{privateintnumber;publicMyClass(intnumber){this.number=number;}publicintgetNumber(){returnnumber;}publicvoidsetNumber(intnumber){this.number=number;}}可以通过三种方式来构造具有状态的线程安全Java类:让它真正不可变publicclassMyClass{privatefinalintnumber;publicMyClass(intnumber){this

java - 带等待/通知和不带它们的同步块(synchronized block)之间的区别?

如果我只使用synchronized,而不是wait/notify方法,它仍然是线程安全的吗?有什么区别? 最佳答案 使用synchronized使方法/block一次只能在线程上访问。所以,是的,它是线程安全的。这两个概念是结合在一起的,并不是相互排斥的。当您使用wait()时,您需要拥有该对象的监视器。所以在这之前你需要有synchronized(..)。使用.wait()使当前线程停止,直到另一个线程对其等待的对象调用.notify()。这是对synchronized的补充,它只是确保只有一个线程会进入一个block/方法。

Python 多处理 : synchronizing file-like object

我正在尝试制作一个类似对象的文件,该文件将在测试期间分配给sys.stdout/sys.stderr以提供确定性输出。它并不意味着快速,只是可靠。到目前为止,我所拥有的几乎可以工作,但我需要一些帮助来消除最后几个极端情况错误。这是我当前的实现。try:fromcStringIOimportStringIOexceptImportError:fromStringIOimportStringIOfromosimportgetpidclassMultiProcessFile(object):"""helperfortestingmultiprocessingmultiprocessingpo

python - 可以创建一个知道方法对象的@synchronized 装饰器吗?

我正在尝试创建一个@synchronized包装器,它为每个对象创建一个锁并使方法调用线程安全。如果我可以访问包装方法中方法的method.im_self,我只能这样做。classB:deff(self):passassertinspect.ismethod(B.f)#OKassertinspect.ismethod(B().f)#OKprintB.f#printB().f#>defsynchronized(func):#funcisnotboundorunbound!printfunc#!!!!assertinspect.ismethod(func)#FAIL#...allocate

Java中synchronized的用法

在Java中,synchronized是一种同步机制,可用于控制多个线程在访问共享资源时的并发问题。synchronized可以修饰方法和代码块,以确保共享资源的互斥访问,从而避免不同线程间访问该资源时发生冲突。synchronized的用法包括以下几种:1.同步方法使用synchronized修饰方法,可以确保在多个线程访问该方法时只有一个线程可以执行该方法。当一个线程进入同步方法时,它就获得了该方法所对应的对象的锁,其他线程将被阻塞,直到执行线程释放锁并退出该方法。需要注意的是,非静态同步方法的锁是该方法所属对象的实例。2.同步代码块使用synchronized修饰代码块,可以确保在多个线