草庐IT

synchronization

全部标签

java - 混合 volatile 和 synchronized 作为读写锁

考虑一个原始类型变量,有很多线程读取和一些线程写入,下面的代码能正常工作吗?如果会,它提供的性能是否优于1)。在所有方法上声明同步;2).使用显式ReadWriteLock?这是一个常见的模式吗?如果不是,这种情况通常使用什么模式?目前这对我来说效果很好,但我觉得同时使用volatile和synchronized有点多余。privatevolatileintvalue=1;publicvoidfunc1(){if(value==1){//dosomething}}publicvoidfunc2(){if(value==2){//dosomething}}publicvoidfunc3(

java - synchronized Collection 的 toArray() 方法是同步的吗?

如果我有一个这样的同步集合Collectionc=Collections.synchronizedCollection(myCollection);synchronizedCollection的javadoc提到外部迭代必须像这样同步:synchronized(c){Iteratori=c.iterator();while(i.hasNext()){process(i.next());}}我可以假设c.toArray()是同步的,因此当方法执行时集合不会发生变化吗?或者我是否也需要同步它:synchronized(c){c.toArray();} 最佳答案

java - 任何人都可以解释如何在 java 中使用 Reentrant Lock over Synchronized 和一些最好的例子

当我在http://javarevisited.blogspot.in/2013/03/reentrantlock-example-in-java-synchronized-difference-vs-lock.html运行示例类时,我看到了与synchronized相同的行为。 最佳答案 这里有线程获取锁和释放锁的三种方式、方法。您可能想尝试使用synchronized关键字来实现这些。使用ReentrantLock的扩展功能和优势将变得显而易见。publicclassDoorLockUsingLock{privateintcou

java - synchronized方法修改后所有java线程都会看到共享资源更新吗?

如果对一对数据结构的所有访问总是包含在锁的获取和释放中(特别是,对数据结构的任何修改使用静态同步方法)。例如:publicstaticsynchronizedItemdoIt(){//removesomethingfromdatastructure1//addtheremoveditemtodatastructure2//returnremoveditem}我知道同步方法一次只会强制一个线程执行更新,但是当一个线程退出该方法时,是否保证其他线程可以看到更新的数据结构,或者我是否仍然需要专门的并发该保证的数据结构?编辑:这是我正在尝试做的一个更好的例子:privatestaticfina

java - 如何正确创建 SynchronizedStack 类?

我用Java制作了一个简单的同步Stack对象,仅用于训练目的。这是我所做的:publicclassSynchronizedStack{privateArrayDequestack;publicSynchronizedStack(){this.stack=newArrayDeque();}publicsynchronizedIntegerpop(){returnthis.stack.pop();}publicsynchronizedintforcePop(){while(isEmpty()){System.out.println("Stackisempty");try{wait();}

java - HashMap 缓存中的同步

我有一个网络应用程序,人们可以在其中请求资源。此资源使用同步HashMap进行缓存以提高效率。这里的问题是当两个不同的请求同时到达同一个未缓存的资源时:检索资源的操作会占用大量内存,因此我想避免对同一个资源多次调用它。有人可以告诉我以下代码片段是否存在任何潜在问题吗?提前致谢。privateMapresources=Collections.synchronizedMap(newHashMap());publicvoidrequest(Stringname){Resourceresource=resources.get(name);if(resource==null){synchroni

java - 同步块(synchronized block)中的意外代码

以下Java代码生成以下JVM字节码。我很好奇为什么会生成偏移量31到偏移量36的代码。JLS7或JVM7规范中没有任何内容谈到这一点。我错过了什么吗?即使我删除了println语句,代码(偏移量31到偏移量36)仍然会生成,只是在较早的位置,因为println调用已被删除。//JavacodevoidtestMonitor(){Booleanx=newBoolean(false);synchronized(x){System.out.println("insidesynchronized");System.out.println("blah");};System.out.printl

java - 在 "this"或 Java 中的私有(private)对象上同步?

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Avoidsynchronized(this)inJava?这两段代码有什么区别?各有什么优缺点?1)publicclassExample{privateintvalue=0;publicintgetNextValue(){synchronized(this){returnvalue++;}}}2)publicclassExample{privatefinalObjectlock=newObject();privateintvalue=0;publicintgetNextValue(){synchronize

java - 这个例子中有竞争条件吗?如果是这样,如何避免?

我正在查看一些通知/等待示例并遇到了这个。我知道同步块(synchronizedblock)本质上定义了一个关键部分,但这不是竞争条件吗?没有指定首先进入哪个同步块(synchronizedblock)。publicclassThreadA{publicstaticvoidmain(String[]args){ThreadBb=newThreadB();b.start();synchronized(b){try{System.out.println("Waitingforbtocomplete...");b.wait();}catch(InterruptedExceptione){e.

java - 类初始化和同步类方法

在我的应用程序中,有一个类如下:publicclassClient{publicsynchronizedstaticprint(){System.out.println("hello");}static{doSomething();//whichwilltakesometimetocomplete}}该类将用于多线程环境,多个线程可能同时调用Client.print()方法。请问有没有可能是thread-1触发类初始化,在类初始化完成前,thread-2进入print方法,打印出“hello”字符串?我在生产系统(64位JVM+Windows2008R2)中看到了这种行为,但是,我无法