Tag: 同步

如何从Inner类引用Enclosing类?

我正在扩展ArrayList以创建一个自定义ArrayList,可以在迭代它时使用常规ArrayList方法进行修改。 为此,我也创建了一个迭代器。 public class SynchronizedList extends ArrayList { // Fields here //Constructors and methods here public class SynchronizedListIterator implements Iterator { public int index; private E current; public boolean hasNext() { synchronized (/* reference to enclosing List object */) { //code goes here } return false; } //more methods here } } 在我的hasNext()和next()方法期间,我需要确保列表未被修改(可以在任何其他时间修改它)。 因此,我需要在synchronized()块中引用我的封闭类型。

Firebase如何与共享数据同步?

我使用Firebase来处理Android应用的Auth主题。 我还在Firebase上保存了一个用户配置文件,其中包含用户ID以及用户可以在Android应用中更新的额外选项。 启动时,应用程序会检查身份validation和身份validation。 它重新加载用户配置文件(在Firebase上),然后在应用程序上更新我的userInstance。 Firebase在应用级别设置为离线function。 userInstance POJO在日志时与Firebase同步,并在unlog时停止同步。 我有一个特殊的参数,在我的用户配置文件中,我可以更改(作为管理员)。 每次我在Firebase控制台上更新它时,它会在应用程序重新启动时替换为之前的值。 怎么会发生这种情况? BTW:1 /基于合并数据的机制,如果多个客户端具有不同的本地值? 这是更简单的代码,我试图重现错误。 : MyApplication.java public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); Firebase.setAndroidContext(this); Firebase.getDefaultConfig().setLogLevel(Logger.Level.DEBUG); Firebase.getDefaultConfig().setPersistenceEnabled(true); } } 主要活动 public class MainActivity extends AppCompatActivity { Firebase ref; User user; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ref = new Firebase(“https://millezim-test.firebaseIO.com”).child(“user”); […]

在java中同步对象,然后更改synchronized-on变量的值

我遇到了这样的代码 synchronized(obj) { obj = new Object(); } 有些事情对此感觉不对,我无法解释,这段代码是好的还是有什么问题,请指出来。 谢谢

不要同时在两个线程之间共享相同的套接字

我有大约60个套接字和20个线程,我想确保每个线程每次都在不同的套接字上工作,所以我不想在两个线程之间共享相同的套接字。 在我的SocketManager类中,我有一个后台线程,每60秒运行一次并调用updateLiveSockets()方法。 在updateLiveSockets()方法中,我迭代我拥有的所有套接字,然后通过调用SendToQueue类的send方法SendToQueue ping它们,并根据响应我将它们标记为活动或死亡。 在updateLiveSockets()方法中,我总是需要迭代所有套接字并ping它们以检查它们是活的还是死的。 现在,所有读者线程将同时调用SocketManager类的getNextSocket()方法,以获得下一个可用的套接字以在该套接字上发送业务消息。 所以我有两种类型的消息,我在套接字上发送: 一个是套接字上的ping消息。 这只是从调用SocketManager类中的updateLiveSockets()方法的计时器线程发送的。 其他是套接字上的business消息。 这是在SendToQueue类中完成的。 因此,如果pinger线程正在ping一个套接字以检查它们是否存在,那么没有其他业务线程应该使用该套接字。 类似地,如果业务线程使用套接字在其上发送数据,那么pinger线程不应该ping该套接字。 这适用于所有套接字。 但我需要确保在updateLiveSockets方法中,每当我的后台线程启动时,我们都会ping所有可用的套接字,以便我们可以确定哪个套接字是活的还是死的。 下面是我的SocketManager类: public class SocketManager { private static final Random random = new Random(); private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); private final Map<Datacenters, List> liveSocketsByDatacenter = new ConcurrentHashMap(); private final ZContext ctx = new ZContext(); // … private SocketManager() { connectToZMQSockets(); […]

Java的“同步”和C#的“锁定”之间有什么区别吗?

这两个关键字是否具有完全相同的效果,或者我应该注意哪些?

如何确保我不是同时在两个线程之间共享相同的套接字?

我有一个代码,我正在处理套接字,我需要确保我不在两个线程之间共享相同的套接字 。 在我的下面的代码中,我有一个后台线程,每60秒运行一次并调用updateLiveSockets()方法。 在updateLiveSockets()方法中,我迭代我拥有的所有套接字,然后通过调用SendToQueue类的send方法SendToQueue ping它们,并根据响应我将它们标记为活动或死亡。 现在所有的读者线程将同时调用getNextSocket()方法来获取下一个可用的套接字,因此它必须是线程安全的,我需要确保所有的读者线程都应该看到相同的SocketHolder和Socket状态。 下面是我的SocketManager类: public class SocketManager { private static final Random random = new Random(); private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); private final Map<Datacenters, List> liveSocketsByDatacenter = new ConcurrentHashMap(); private final ZContext ctx = new ZContext(); // … private SocketManager() { connectToZMQSockets(); scheduler.scheduleAtFixedRate(this::updateLiveSockets, 60, 60, TimeUnit.SECONDS); } // during startup, making […]

用于Java中的实例方法同步的等效代码

在讨论Java同步问题时 ,有人评论说下面的代码片段不相同(并且可能编译为不同的字节码): public synchronized void someMethod() { //stuff } 和 public void someMethod() { synchronized (this) { //stuff } } 它们是等价的吗?

双重检查锁定物品

我正在阅读这篇关于“双重检查锁定”的文章,并且在文章的主题之外我想知道为什么在文章的某些方面作者使用下一个成语: 清单7.尝试解决乱序写入问题 public static Singleton getInstance() { if (instance == null) { synchronized(Singleton.class) { //1 Singleton inst = instance; //2 if (inst == null) { synchronized(Singleton.class) { //3 inst = new Singleton(); //4 } instance = inst; //5 } } } return instance; } 我的问题是:有没有理由将两次代码同步锁定同一个锁? 有这个任何目的吗? 提前谢谢了。

Java中的并发:同步静态方法

我想了解如何在Java中对静态方法进行锁定。 假设我有以下课程: class Foo { private static int bar = 0; public static synchronized void inc() { bar++; } public synchronized int get() { return bar; } 我的理解是,当我调用f.get() ,线程获取对象f的锁定,当我执行Foo.inc() ,线程获取类Foo上的锁。 我的问题是两个呼叫如何相互同步? 调用静态方法也会获取所有实例化的锁定,或者相反(这似乎更合理)? 编辑: 我的问题不是static synchronized工作原理,而是静态和非静态方法如何相互同步。 即,我不希望两个线程同时调用f.get()和Foo.inc() ,但这些方法获取不同的锁。 我的问题是这是如何可以预防的,并且在上面的代码中是否被阻止了。

测试Java方法是否同步的好方法是什么?

我有几个实现一些接口的类。 接口有一个契约,有些方法应该同步,有些不应该,我想通过unit testing来validation所有实现的合同。 这些方法应该使用synchronized关键字或者锁定this – 非常类似于synchronizedCollection()包装器。 这意味着我应该能够在外部观察它。 要继续Collections.synchronizedCollection()的示例,如果我有一个线程调用iterator(),我仍然可以使用另一个线程进入add()等方法,因为iterator()不应该执行任何锁定。 另一方面,我应该能够在外部同步集合,并看到另一个线程阻塞add()。 有没有一种方法可以测试方法是否在JUnit测试中同步? 我想避免长时间的睡眠陈述。