Tag: 同步

为什么主要顺序中没有呼叫?

我正在阅读一本关于线程/同步的简单示例,该书声称使用synchronized将允许在同一实例上调用一个线程来访问该方法。 它确实按照承诺进行了序列化,但似乎在下面的Synch main方法中创建的第三个Caller大约9/10倍出现在第二个之前。 此代码是示例代码,显示没有同步方法的问题。 class CallMe { void call(String msg) { System.out.print(“[” + msg); try { Thread.sleep(1000); } catch (InterruptedException e) { System.out.println(“CallMe Interrupted”); } System.out.println(“]”); } } class Caller implements Runnable { String msg; CallMe target; Thread t; public Caller (CallMe target, String msg) { this.target = target; this.msg = msg; t = new […]

与Java的网络时间同步

我正在使用Java创建一个p2p audio-midi流媒体应用程序(不幸的是)我正在寻找一种使用可靠的协议实现(如NTP)在某些对等体(源)之间提供网络时间同步的方法,但我找不到任何相关的库都可以使用。我也花费有限的时间来实现这样的事情。 那么,有没有人知道使用Java,NTP或替代协议/方法/想法进行网络时间同步的任何解决方案? 我真的很感激任何想法! 谢谢!

Java同步和静态同步方法访问静态字段

以下程序的行为是什么,静态同步方法和实例同步方法试图在不同线程中访问同一类的静态字段? 任何线程都会被阻止吗? 它非常令人困惑。 class MyClass { public static int i = 5; public synchronized void m1() { System.out.println(i); //uses static field i of MyClass //T1 is executing this method } public static synchronized void m3() { //T2 will be able to call this method on same object lock while it is using //static field i??? […]

两个线程执行两个`synchronized`方法?

我正在阅读有关JAVA同步的内容。 我class上有两种方法。 public synchronized void eat() { System.out.println(“eat”); eatDinner(); } public synchronized void eatDinner() { System.out.println(“eat”); } 我的两个方法都是同步的。 现在2个线程可以调用eat()而另一个eatDinner()可以同时运行吗? 如果thread2还没有执行eatDinner() 。 thread1可以从eat()调用eatDinner() eat()吗?

限制对方法的并发访问

我有限制并发访问方法的问题。 我有一个方法MyService ,可以在很多时候从很多地方调用。 此方法必须返回一个String ,应根据某些规则进行更新。 为此,我有一个updatedString类。 在获取String之前,它确保更新String ,如果没有,则更新它。 许multithreading可以同时读取String但是如果它已经过时,只有一个应该同时更新String 。 public final class updatedString { private static final String UPstring; private static final Object lock = new Object(); public static String getUpdatedString(){ synchronized(lock){ if(stringNeedRenewal()){ renewString(); } } return getString(); } … 这很好用。 如果我有7个线程获取String,它保证,如果需要,只有一个线程正在更新String。 我的问题是,将所有这些都static是一个好主意吗? 为什么不呢? 它快吗? 有一个更好的方法吗? 我读过这样的post: 什么案例需要Java中的同步方法访问? 这表明静态可变变量不是一个好主意,也不是静态类。 但我看不到代码中的任何死锁或更好的有效解决方案。 只有某些线程必须等到String更新(如果需要)或等待其他线程离开同步块(这会导致一个小的延迟)。 如果该方法不是static ,那么我有一个问题,因为这不起作用,因为synchronized方法仅适用于线程正在使用的当前实例。 同步方法也不起作用,似乎是锁具实例特定而不是特定于类。 […]

如何在java中实现类级别锁定?

我知道锁定概念与静态和非静态方法同步分别锁定类和实例。 我无法理解的是,如何实现class级锁定? 我的意思是,课程只是一个模板,没有任何物理意义。 那么,当我们说通过同步静态方法实现类级别锁定时会发生什么呢? 该类的所有对象是否被锁定或其他进程? 我可以通过搜索找到的是有类对象(Class.class)并且在此类对象上获取了锁。 但那个class级的所有实例也是如何锁定的呢?

有多少个线程可以同时调用对象的非同步方法?

所以,假设我有一个带有方法m的类X. 方法m 不是同步的,它不需要,因为它不会真正改变X类型的对象x的状态。 在某些线程中,我调用这样的方法:xm()。 所有这些线程都使用相同的对象x。 这个方法(方法m)可以同时在对象x上调用多少个线程? 可能是这个方法被调用,比方说,100个线程是我的应用程序的瓶颈? 谢谢。

抛出不可能的NullPointerException

在几年前写的一个网络服务器项目中,我偶尔会得到一个非常奇怪的 – 在我看来 – 不可能是NullPointerException 。 它发生在用于在控制台上记录输出的实用程序方法中。 这是该方法的错误摘录: try { Encoder encoder = Base64.getEncoder(); if(logWriter != null) { logWriter.write(String.valueOf(System.currentTimeMillis())); logWriter.write(” “); logWriter.write(String.valueOf(level)); logWriter.write(” “); logWriter.write(encoder.encodeToString(Thread.currentThread().getName().getBytes()).replaceAll(“(?:\\r\\n|\\n\\r|\\n|\\r)”, “”)); logWriter.write(” “); logWriter.write(encoder.encodeToString(log.getBytes()).replaceAll(“(?:\\r\\n|\\n\\r|\\n|\\r)”, “”)); logWriter.write(“\r\n”); logWriter.flush(); } lastWriterActivity = System.currentTimeMillis(); } catch (IOException e) { println(“Failed to write log to file: ” + e, Color.RED); try { logWriter.close(); } […]

我如何有条件地锁定Java?

我一直在利用Java的synchronized块来使我的代码线程部分安全。 我正在将数据结构移植到通常可以使用synchronized块的java,但我并不总是知道如何以典型的Java方式使用它们。 以下是一个场景的示例: myMethod (Bool useLock) { if (useLock) { //locks the following section of code until unlocked. lockObject.lock(); } //do more stuff…. if (useLock) { //unlocks exclusive control of code. lockObject.unlock(); } } 我如何在Java中完成相同的操作? 在这段代码中,有时我想锁定,有时我不想,但我想要聪明一点,而不必编写相同代码的两个版本。 除了使用synchronized块之外,还有其他方法可以锁定Java吗?

程序停止:wait()和notify()

我试图实现这一点:创建两个不同的线程,一个打印奇数,一个打印偶数。 一旦一个线程打印一个数字,它就必须等待另一个线程,依此类推,即一个接一个。 为实现这一点,我使用synchronized块以及wait()和notify()。 我正在创建一个类,其对象将用于传递给两个线程中的synchronized块。 这是代码: – >这是用于传递给synchronized块的对象。 package com.vipin.multithread.variousdemos; public class SyncObject { public SyncObject () { } } 奇数线程: package com.vipin.multithread.variousdemos; public class OddThread implements Runnable { private Thread t; int index=0; SyncObject so=null; int odd_nums[] = {1,3,5,7,9}; public OddThread(SyncObject so) { t = new Thread(this,”Odd Thread”); this.so = so; t.start(); } public Thread […]