jjzjj

synchronize

全部标签

java - 嵌套同步块(synchronized block)

假设我有下一节课:publicclassService{publicvoidtransferMoney(AccountfromAcct,AccounttoAcct,intamount){synchronized(fromAcct){synchronized(toAccount){//couldweusehereonlyonesynchronizedblock?fromAcct.credit(amount);toAccount.debit(amount);}}}}classAccount{privateintamount=0;publicvoidcredit(intsum){amount

java - 为什么static和default接口(interface)方法不能synchronize却可以strictfp?

这个问题在这里已经有了答案:Whatisthereasonwhy“synchronized”isnotallowedinJava8interfacemethods?(2个答案)关闭4年前。为什么静态和默认接口(interface)方法不能同步?人们说同步是一个实现细节。好吧,strictfp也是一个实现细节,但这并不妨碍在静态和默认接口(interface)方法上允许strictfp。默认方法是继承的,如果实现接口(interface)的类没有覆盖默认方法,那么让它已经同步可能会非常方便。我猜测synchronized(以及strictfp)不是继承的(我在这里吗?),但这并不能解释为

java - Class对象A是在JVM加载A类时创建的,还是我调用A.class时创建的?

据我所知,每个类都有一个Class对象。我使用synchronize时有一种情况,例如:publicclassA{publicstaticvoidmain(String...args){synchronize(A.class){//dosomething...}}}这将锁定A的Class对象,对吗?这个Class对象是什么时候创建的?它是在JVM加载A类时创建的还是在我调用A.class时创建的?我在JLS中找不到详细信息,有人可以提供相关链接吗? 最佳答案 thiswilllockA'sClassobject,right?是的。m

java - Java 编译器是否优化了空的同步块(synchronized block)?

假设我在代码的某处写了一个空的synchronizedblock:synchronized(obj){//Nocodehere}因此,由于同步块(synchronizedblock)不包含任何代码,JIT编译器是否会通过不锁定obj来优化它,因为它没有用?Java编译器会做一些类似的技巧,例如Lockcoarsening,但是这个同步块(synchronizedblock)是否也会被优化掉?编辑:根据assylias的观点,synchronized(newObject()){//emptyblock}JIT编译器现在是否能够优化它,因为我使用的对象不会转义我的方法?

Java:从同步块(synchronized block)启动新线程时会发生什么?

这里的第一个问题:这是我不知道的Java中一个非常简短但基本的东西......在下面的例子中,run()方法是否以某种方式执行了somemethod()获得的锁?publicsynchronizedvoidsomemethod(){Threadt=newThread(newRunnable(){voidrun(){... 最佳答案 没有。run()在其自己的上下文中同步启动。它不持有任何锁。如果是这样,您要么会遇到死锁,要么会违反规定在任何给定时间只有一个线程可以持有对象锁的规范。如果run()对同一个对象再次调用somemetho

java - 哈希表:为什么get方法是同步的?

我知道Hashtable是同步的,但为什么它的get()方法是同步的?难道只有读方法吗? 最佳答案 如果读取不同步,则可以在读取执行期间修改哈希表。可以添加新元素,底层数组可能变得太小,可以用更大的数组替换等。如果没有顺序执行,很难处理这些情况。但是,即使get不会在Hashtable被另一个线程修改时崩溃,synchronized关键字还有另一个重要方面,即缓存同步。让我们使用一个简化的例子:classFlag{boolvalue;boolget(){returnvalue;}//WARNING:notsynchronizedsy

java - 'synchronized' 真的只是语法糖吗?

我是多线程的新手,我编写了这段代码,它通过并发运行的线程递增并打印一个变量来打印数字1-10000。这是我使用的代码:packagethreadtest;publicclassMain{staticinti=0;staticObjectlock=newObject();privatestaticclassIncrementerextendsThread{@Overridepublicvoidrun(){while(true){synchronized(lock){if(i>=10000)break;i++;System.out.println(i);}}}}publicstaticvo

java - Java synchronized 关键字是否刷新缓存?

仅限Java5及更高版本。假设一台多处理器共享内存计算机(您现在可能正在使用一台)。这是一个单例延迟初始化的代码:publicfinalclassMySingleton{privatestaticMySingletoninstance=null;privateMySingleton(){}publicstaticMySingletongetInstance(){if(instance==null){synchronized(MySingleton.class){if(instance==null){instance=newMySingleton();}}}returninstance;

java - 遍历集合时如何防止嵌套同步块(synchronized block)

在多线程Java应用程序中,我需要遍历一组对象。由于集合和对象都可能在我迭代它们时被另一个线程修改,所以我需要使用同步。然而,不推荐使用嵌套的同步块(synchronizedblock),因为它们可能会导致死锁。我该如何解决这个问题?CollectiondataCollection=something.getDataCollection();synchronized(dataCollection){for(finalDatadata:dataCollection){synchronized(data){data.doSomething();//doSomething()changeso

java - 同步块(synchronized block)和监视器对象

你好有人可以解释一下如果在下面的代码中同步代码会限制对线程的访问。如果是,它与我们使用“this”而不是“msg”作为监视器对象有何不同。publicvoiddisplay(Stringmsg){synchronized(msg){for(inti=1;i 最佳答案 仅当两个线程使用完全相同的msg对象调用此方法时,您编写的方法才会阻塞。如果您在this上进行同步,那么在给定时间只有一个线程能够调用该方法。 关于java-同步块(synchronizedblock)和监视器对象,我们在S