我有一个用java编写的分布式程序.我希望我的节点访问同步的物理时钟.
我知道NTP是物理时钟同步的协议.我知道我可以通过sudo apt-get ntp在linux上安装它.
我的问题是当我安装它时,如何在我的java程序中访问这个同步时钟?我的意思是当我在我的机器上安装ntp时会发生什么?我的系统 时钟会同步吗?
谢谢 :)
我正在用 Java 实现分布式键值存储。我需要为每个键保存一个时间戳。由于我想在系统中拥有大量的密钥,所以我决定使用BigInteger代替long,但我担心它的效率。
请注意,我没有任何乘法,我只使用了additionand comparTo。那么您认为 的BigInteger效率明显低于 吗long?
这是我第一次尝试BigInteger,相比之下还有什么问题吗long?
为什么我不能克隆ConcurrentHashMap?
ConcurrentHashMap<String, String> test = new ConcurrentHashMap<String, String>();
test.put("hello", "Salaam");
ConcurrentHashMap<String, String> test2 = (ConcurrentHashMap<String, String> ) test.clone();
System.out.println(test2.get("hello"));
Run Code Online (Sandbox Code Playgroud)
如果我使用HashMap而不是ConcurrentHashMap,它的工作原理.
因为,statckoverflow不允许在原始问题中为你的问题添加更多东西(你只能添加注释,而不是代码)我在这里问一个顺序问题我的原始问题: 我们可以为每个条目而不是ConcurrentHashMap使用Synchronized吗?
问题很简单,我不知道为什么这么简单的问题可能很多人在我之前遇到过这个问题我应该花这么多时间:/
问题是:我有一个hashmap,我想当一个线程正在处理hashMap的一个条目时,没有任何其他线程访问该对象,我不想锁定整个hashMap.
我知道java提供了ConcurrentHashMap,但是当你想做一些比简单的put和get更复杂的事情时,ConcurrentHashMap并没有解决问题.即使是新增的函数(在Java 8中),如合并也不足以应对复杂的场景.
例如:
假设我想要一个将字符串映射到ArrayLists的哈希映射.然后例如假设我想这样做:对于密钥k,如果有任何条目,则将newString添加到其ArrayList,但如果没有k的条目,则为k创建条目,使其ArrayList具有newString.
我以为我可以这样做:
ArrayList<String> tm =new ArrayList<String>();
tm.add(newString);
Object result = map.putIfAbsent(k, tm);
if (result != null)
{
map.get(k).add(newString);
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用,为什么?假设putIfAbset返回null以外的其他内容,则表示map已经有一个带有键k的条目,因此我将尝试将newString添加到已存在条目的ArrayList中,但是在添加之前,另一个线程可能会删除该条目,并且然后我会得到NullPointerException!
所以,我发现很难正确地编写这样的东西.
但我在想,如果我能简单地锁定那个条目,那么生活将是美好的!
在我之前的帖子中,我提出了一些非常简单的事实,实际上消除了对concurrentHashMap的需求,并提供了入门级锁定,但有些人认为这不是真的,因为Long不是不可变的......我没有把它弄好.
现在,我实现并测试了它,它看起来不错,但我不知道为什么其他更有经验的开发人员告诉我它不是线程安全的:(
这是我测试的确切代码:
MainThread:
import java.util.HashMap;
public class mainThread {
public static HashMap<String, Long> map = new HashMap<String, Long>();
public static void main (String args[])
{
map.put("k1", new Long(32));
synchronized(map.get("k1"))
{
Thread t = new Thread(new threadA());
t.start();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block …Run Code Online (Sandbox Code Playgroud) 我想要:
我想出了下面的代码,但正确的是它有(而且),它看起来很可怕:)
我想和你们一起检查一下.你认为它有效吗?
// Input: map, k, t
while (true) {
if (map.containsKey(k)) {
current = map.get(k);
if (current != null && current < t) {
if (map.replace(k, current, t))
break;
} else if (current != null && current >= t) {
break;
}
} else {
pre = map.putIfAbsent(k, t);
if (pre == null)
break;
}
}
Run Code Online (Sandbox Code Playgroud)