Tag: 同步

等待Java的条件

我想创建一个线程,当它变为空时将值放入队列并等待这个条件,而不是。 这是我尝试使用的代码,但它打印出来 Adding new Taking Value 1 Taking Value 2 Taking Value 3 Taking Value 4 所以它只工作一次。 问题是什么? import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; public class SO { public String test; public String[] list = new String[] {test}; public static void main(String[] args) { new SO(); } public SO() { go(); } BlockingQueue qq = new LinkedBlockingQueue(); […]

静态和非静态方法的同步块

我创建了两个线程并使用了一个类的实例,称为该对象的静态和非静态方法。 理想情况下,需要使用类名调用静态方法,我也这样做。 我在类的私有静态成员上同步静态和非静态方法,这些成员的线程正在调用它们的方法。 我注意到输出是同步的! 我的问题是: 静态方法如果使用synchronized块同步它通常需要类实例,那么它是如何接受静态对象的! 当调用静态方法的线程获取类级别锁定并且调用非静态方法的线程获取对象级别锁定时,输出如何同步! 即使我在基于对象的静态和非静态方法中都使用了synchronized块,它实际上也不应该同步; 或者是静态对象上的同步块的特殊情况? 请告诉我。 以下是我写的代码: public class StaticNonStaticSynch { public static void main(String[] args) { final StaticNonStaticTest staticNonStaticTest = new StaticNonStaticTest(); Runnable runnable1 = new Runnable() { @Override public void run() { staticNonStaticTest.nonStaticMethod(); } }; Runnable runnable2 = new Runnable() { @Override public void run() { staticNonStaticTest.staticMethod(); } }; […]

java静态同步方法

当两个线程同时使用不同的实例调用静态同步方法时会发生什么? 可能吗? 对象锁用于非静态同步方法,但是什么类型的锁用于静态同步方法?

Spring @Transactional并发

class MyService { public void a() { synchronized(somekey) { b(); } } @Transactional(propagation = Propagation.REQUIRES_NEW) public void b() { …do DB works… } } class MyService { public void a() { synchronized(somekey) { b(); } } @Transactional(propagation = Propagation.REQUIRES_NEW) public void b() { …do DB works… } } class MyService { public void a() { […]

如何在Java中进行multithreading处理

我必须multithreading一个运行1000批次代码的方法。 我需要将这些批次分配给不同的线程。 目前我已经产生了3个线程,但是所有3个线程都在挑选第一批1000个线程。 我希望其他批次不应该选择相同的批次而是选择另一批次。 请帮忙并提出建议。

如何使用多个线程的wait和notify协议

具体来说,有人可以告诉我这段代码有什么问题。 它应该启动线程,所以应该打印“输入线程…”5次,然后等到调用notifyAll()。 但是,它会随机打印“Entering ..”和“Done ..”,并且仍在等待其他人。 public class ThreadTest implements Runnable { private int num; private static Object obj = new Object(); ThreadTest(int n) { num=n; } @Override public void run() { synchronized (obj) { try { System.out.println(“Entering thread “+num); obj.wait(); System.out.println(“Done Thread “+num); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void […]

局部变量同步的必要性

在JSON-java库( org.json.JSONArray )中,我发现这个代码片段带有一个围绕方法局部变量的synchronized块 public String toString(int indentFactor) throws JSONException { StringWriter sw = new StringWriter(); synchronized (sw.getBuffer()) { return this.write(sw, indentFactor, 0).toString(); } } 我不明白这里同步的必要性,因为StringWriter只是给定方法的本地(以及为什么同步在Buffer上)。 这里的同步是否真的有必要,如果,为什么?

在构造函数中使用synchronized块有什么用?

我们不能使构造函数synchronized但可以在内部构造函数中编写synchronized 。 在什么情况下这样的要求会来? 我很开心。 package com.simple; public class Test { public Test() { synchronized (this) { System.out.println(“I am called …”); } } public static void main(String[] args) { Test test=new Test(); System.out.println(“”+test); } @Override public String toString() { return “Test []”; } }

如何在java中同步静态方法

在Java中实现单例模式时,我想出了这个问题。 即使下面列出的示例不是我的真实代码,但与原始代码非常相似。 public class ConnectionFactory{ private static ConnectionFactory instance; public static synchronized ConnectionFactory getInstance(){ if( instance == null ){ instance = new ConnectionFactory(); } return instance; } private ConnectionFactory(){ // private constructor implementation } } 因为我不太确定静态同步方法的行为,所以我从谷歌得到了一些建议 – 在同一个类中没有(或尽可能少)多个静态同步方法。 我想在实现静态同步方法时,会使用属于Class对象的锁,这样多个静态同步方法可能会降低系统的性能。 我对吗? 或者JVM使用其他机制来实现静态同步方法? 如果我必须在类中实现多个静态同步方法,那么最佳实践是什么? 谢谢你们! 亲切的问候!

何时对同步块的更改对其他线程可见

假设我在synchronized方法中更新了两个变量的值。 在退出synchronized块之前 ,同步方法中设置的新值是否可能对其他线程可见? public synchronized void setValues(){ a=5; // assume thread is preempted after this assignment // would the value 5 be visible to other threads? // my understanding is that the values will not be flushed to // main memory until the lock is released- ie, until the synchronized // method is complete. So […]