有人告诉我,Java构造函数是同步的,因此在构造期间无法同时访问它,我想知道:如果我有一个构造函数将对象存储在一个映射中,另一个线程在构造之前从该映射中检索它完成后,该线程会阻塞,直到构造函数完成?
让我演示一些代码:
public class Test {
private static final Map<Integer, Test> testsById =
Collections.synchronizedMap(new HashMap<>());
private static final AtomicInteger atomicIdGenerator = new AtomicInteger();
private final int id;
public Test() {
this.id = atomicIdGenerator.getAndIncrement();
testsById.put(this.id, this);
// Some lengthy operation to fully initialize this object
}
public static Test getTestById(int id) {
return testsById.get(id);
}
}
Run Code Online (Sandbox Code Playgroud)
假设put/get是地图上唯一的操作,所以我不会通过迭代之类的东西获得CME,并试图忽略其他明显的缺陷.
我想知道的是,如果另一个线程(显然不是那个构造对象的线程)尝试使用getTestById并调用它上面的东西来访问该对象,它会阻塞吗?换一种说法:
Test test = getTestById(someId);
test.doSomething(); // Does this line block until the constructor is done?
Run Code Online (Sandbox Code Playgroud)
我只是想弄清楚构造函数同步在Java中走了多远,以及像这样的代码是否有问题.我最近看过像这样的代码,而不是使用静态工厂方法,我想知道这在多线程系统中是多么危险(或安全).
Java中安装了Java 7.
http://download.oracle.com/otn-pub/java/jdk/7u7-b10/jdk-7u7-macosx-x64.dmg
JDK 7 Update 07.pkg
Run Code Online (Sandbox Code Playgroud)
我从Oracle下载了安装程序,安装成功了.但我在/ System/Library中找不到它
/System/Library/Java/JavaVirtualMachines] $ ls
1.6.0.jdk
Run Code Online (Sandbox Code Playgroud) 我在Java 6中有一个正确编译的接口:
public interface IMultiMap<K, V> extends Map<K, Set<V>> {
public int valueSize();
public boolean put(K key, V value);
public void clear(Object key);
public boolean isEmpty(Object key);
}
Run Code Online (Sandbox Code Playgroud)
但在Java 7中,此接口无法编译.我得到一个编译错误boolean put(K, V),它具有相同的擦除V put(K, V).编译器的完整错误:
error: name clash: put(K#1,V#1) in IMultiMap and put(K#2,V#2) in Map have the same erasure, yet neither overrides the other
public boolean put(K key, V value);
where K#1,V#1,K#2,V#2 are type-variables:
K#1 extends Object declared in interface IMultiMap
V#1 extends Object declared in interface …Run Code Online (Sandbox Code Playgroud) 在评估我的java代码时,我遇到了一个大问题.为了简化问题,我编写了以下代码,这些代码产生了同样的奇怪行为.重要的是方法run()和给定的双倍价值率.对于我的运行时测试(在main方法中),我将速率设置为0.5一次,另一次设置为1.0.使用值1.0时,if语句将在每次循环迭代中执行,并且值为0.5时,if语句将执行一半.出于这个原因,我预计第一种情况下运行时间会更长,但情况相反.谁能解释一下这个现象?
主要结果:
Test mit rate = 0.5
Length: 50000000, IF executions: 25000856
Execution time was 4329 ms.
Length: 50000000, IF executions: 24999141
Execution time was 4307 ms.
Length: 50000000, IF executions: 25001582
Execution time was 4223 ms.
Length: 50000000, IF executions: 25000694
Execution time was 4328 ms.
Length: 50000000, IF executions: 25004766
Execution time was 4346 ms.
=================================
Test mit rate = 1.0
Length: 50000000, IF executions: 50000000
Execution time was 3482 ms.
Length: 50000000, IF executions: 50000000
Execution time …Run Code Online (Sandbox Code Playgroud) 我正在调用返回TreeMap实例的函数,并在调用代码中我想修改TreeMap.但是,我得到了一个ConcurrentModificationException.
这是我的代码:
public Map<String, String> function1() {
Map<String, String> key_values = Collections.synchronizedMap(new TreeMap<String, String>());
// all key_values.put() goes here
return key_values;
}
Run Code Online (Sandbox Code Playgroud)
我的调用代码是:
Map<String, String> key_values =Collections.synchronizedMap(Classname.function1());
//here key_values.put() giving ConcurrentModificationException
Run Code Online (Sandbox Code Playgroud) 我想从criteria.txt文件中读取 ,以标记化并在同一文件的末尾附加标记.该程序抛出异常:No file found!我不知道我的错误在哪里.任何建议都会对我有所帮助.先感谢您!
这是我的代码:
import java.io.*;
import java.util.StringTokenizer;
public class Test
{
private FileReader fr;
private BufferedReader br;
private FileWriter fw;
private BufferedWriter bw;
private StringTokenizer strtok;
private String s;
//constructor
public Test()
{
try
{
fw=new FileWriter("criteria.txt", true);
bw=new BufferedWriter(fw);
try
{
fr=new FileReader("criteria.txt");
br=new BufferedReader(fr);
while((s=br.readLine())!=null)
{
strtok=new StringTokenizer(s," ");
while(strtok.hasMoreTokens())
{
bw.write("\n"+strtok.nextToken());
}
br.close();
}
}
catch(FileNotFoundException e)
{
System.out.println("File was not found!");
}
catch(IOException e)
{
System.out.println("No file found!");
}
bw.close(); …Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的Android应用程序中做一些基本的计算内容来比较一个Date.getTime()值和一些计算的东西.
我在数据库查询期间进行的计算是:
long minus = pauseDays * 24 * 60 * 60 * 1000;
Run Code Online (Sandbox Code Playgroud)
所以基本上我计算的是毫秒值pauseDays.如果pauseDays变大(我说的是90天左右),就会发生一些奇怪的事情.计算结果为负数.
奇怪的是,结果应该是7776000000,所以它应该小于Long.MAX_VALUE.有人可以向我解释为什么我在这里得到负数吗?
我想在Java中枚举有限正则表达式的所有可能值以用于测试目的.
对于某些上下文,我有一个正则表达式,我用它来匹配单词中允许的颜色值.这是一个缩短版本的例子:
(white|black)|((light|dark) )?(red|green|blue|gray)
Run Code Online (Sandbox Code Playgroud)
我想创建一个单元测试,它将枚举所有这些值并将它们传递给我的实用程序类,该实用程序类Color从这些生成一个对象,这样,如果我更改正则表达式,我的单元测试将在发生错误时失败(即不支持新的颜色值).
我知道枚举是可能的,当然(见这个问题),但有针对Java的现有库,这将枚举所有的正则表达式的可能匹配?
编辑:我已经实现了一个执行此操作的库.请参阅下面的答案以获取链接.
我有一个来自另一个闭源的库的类,但我希望能够使用它的接口.原因是我不想在任何地方进行instanceof检查或检查null,但我也不想扩展现有的类.
例如,假设我有这样的代码:
public class Example {
// QuietFoo is from another library that I can't change
private static QuietFoo quietFoo;
// LoudFoo is my own code and is meant to replace QuietFoo
private static LoudFoo loudFoo;
public static void main(String[] args) {
handle(foo);
}
private static void handle(Object foo) {
if (foo instanceof QuietFoo)
((QuietFoo) foo).bar();
else if (foo instanceof LoudFoo)
((LoudFoo) foo).bar();
}
}
Run Code Online (Sandbox Code Playgroud)
我无法改变QuietFoo:
public class QuietFoo {
public void bar() { …Run Code Online (Sandbox Code Playgroud) 如何从Java中的字符串开头删除空格而不从末尾删除?
如果值是:
String temp = " hi "
Run Code Online (Sandbox Code Playgroud)
那我怎么才能只删除前面的空白区域,所以它看起来像这样:
String temp = "hi "
Run Code Online (Sandbox Code Playgroud)
我当前的实现是循环,检查第一个字符并创建一个子字符串,直到达到第一个非空白值.
谢谢!
java ×10
adapter ×1
android ×1
collections ×1
concurrency ×1
constructor ×1
enumeration ×1
file-io ×1
for-loop ×1
generics ×1
installation ×1
instanceof ×1
interface ×1
java-6 ×1
java-7 ×1
long-integer ×1
macos ×1
performance ×1
random ×1
regex ×1
treemap ×1
trim ×1
whitespace ×1