注意我不是在问死锁的概念.我感兴趣的是,如果您在生产群集服务器中的Java应用程序中遇到此问题并具有调试技巧,您将采取什么措施.
题
假设
目标
我想让我的Web应用程序能够脱机工作,一旦它上线或再次连接,它就应该能够在离线模式下传输用户所做的修改.
我已经看到Google Gears是我的问题的理想解决方案,不建议使用它,因为它现在已被弃用.
在使用技术和应用程序设计方面,使我的应用程序脱机工作的好方法是什么?
作为一个例子,我想使用Jackson 序列化/反序列化Slick2d的Animation类的一个对象.最简单的方法是什么?
这是OpenJDK6的hotspot/src/share/vm/prims/unsafe.cpp代码片段(从第1082行开始):
// JSR166 ------------------------------------------------------------------
UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSwapObject(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject e_h, jobject x_h))
UnsafeWrapper("Unsafe_CompareAndSwapObject");
oop x = JNIHandles::resolve(x_h);
oop e = JNIHandles::resolve(e_h);
oop p = JNIHandles::resolve(obj);
HeapWord* addr = (HeapWord *)index_oop_from_field_offset_long(p, offset);
if (UseCompressedOops) {
update_barrier_set_pre((narrowOop*)addr, e);
} else {
update_barrier_set_pre((oop*)addr, e);
}
oop res = oopDesc::atomic_compare_exchange_oop(x, addr, e);
jboolean success = (res == e);
if (success)
update_barrier_set((void*)addr, x);
return success;
UNSAFE_END
Run Code Online (Sandbox Code Playgroud)
还添加了关键方法oopDesc :: atomic_compare_exchange_oop.
inline oop oopDesc::atomic_compare_exchange_oop(oop exchange_value,
volatile HeapWord …Run Code Online (Sandbox Code Playgroud) 我想实现一个线程安全的函数来从java.util.Date中删除时间部分.
我试过这种方式
private static final DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
public static Date removeTimeFromDate(Date date) {
Date returnDate = date;
if (date == null) {
return returnDate;
}
//just have the date remove the time
String targetDateStr = df.format(date);
try {
returnDate = df.parse(targetDateStr);
} catch (ParseException e) {
}
return returnDate;
}
Run Code Online (Sandbox Code Playgroud)
并使用synchronized或threadLocal使其成为线程安全的.但它有更好的方法在Java中实现它.看来这种方式有点冗长.我对此不满意.
我正在尝试hsqldb 2.2.5版的缓存表功能.
只是使用JDBC批量插入到一个表中,奇怪的是如果我单独运行我的测试,虽然我使用了创建缓存表,但它仍然使用内存模式,因为在100,0000条记录之后,OOM.
但是,如果我在此测试用例或使用之前运行其他测试jdbc:hsqldb:mem:HSQLDB;hsqldb.default_table_type=cached
,它将使用缓存表.
无论如何,我不想使用缓存默认.
缓存表性能在2600000条记录之后 看起来如此 ,性能下降了不少.在3600000条记录之后,它变得非常缓慢
也许一些索引占用内存完全使JVM变得缓慢.不是因为db本身
两个子问题
1)强制缓存表的任何其他配置是否使用缓存模式?
2)任何db配置都有助于提高缓存表的性能?
(使用JDK1.6 -Xmx1024m)
AFAIK,java中提供了两种方法来从其名称初始化一个类.
类
public static Class forName(String className)抛出ClassNotFoundException
public static Class forName(String name,boolean initialize,ClassLoader loader)抛出ClassNotFoundException
ClassLoader:
public class loadClass(String name)throws ClassNotFoundException {return loadClass(name,false); }
已知的是在forName方法中,我们可以将initialize的标志指定为false,这将跳过为该类初始化的一些静态事物.但还有什么呢?我应该如何正确使用它们?
你可以展示一些很好的例子.
谢谢!
更新:
提出问题之后,我做了一些简单的classLoader测试.
ClassLoader cls = ClassLoader.getSystemClassLoader();
Class someClass = cls.loadClass("Test");
Class someClass0= Class.forName("Test");
Class someClass1= Class.forName("Test",false,cls);
URL[] urls = new URL[] {new File("bin/").toURL()};
ClassLoader cls2 = new URLClassLoader(urls, null);
Class someClass2 = cls2.loadClass("Test");
ClassLoader cls3 = new URLClassLoader(urls, cls);
Class someClass3 = cls3.loadClass("Test");
System.out.println(someClass.equals(someClass0));
System.out.println(someClass.equals(someClass1));
System.out.println(someClass.equals(someClass2));
System.out.println(someClass.equals(someClass3)); …Run Code Online (Sandbox Code Playgroud) 我只是听到并看到有人说scala是为MultiThread设计的,尽管它实际上是出于通用目的.
它声称"事情是,虽然你可以在Java中创建线程安全的类(如果你知道你正在做什么),Scala让它变得简单而自然."
事实上,AKKA和Lift是用scala编写的.(实际上是java和scala)
但java在java.util.concurrent的新包中也在这方面做了改进.那么为什么AKKA和Lift出生在JAVA?
也许你会说scala使java看起来像C. :-)
我知道可以混合使用JAVA和scala.Scala能够无缝地调用Java代码.那么java有什么,scala也是如此.
只有一些设计像演员/代理或其他什么?(注意Actors/Agents无法解决MultiThread中的所有问题.)
我听到一些消息称scala将能够采用XText.为了能够利用XText编写线程逻辑,不确定这是否属实.
UPDATE
编辑
有关:
其实我很感兴趣,有些人可以用一些全新的角度回答这个问题,这可以启发我的思想,提供一些未知的想法.
但由于没有建设性,它已经关闭了.:-)
我只是在一个来自infoq的经历分享演示中找到.它声称如果你将字符串转换为servlet中的byte [],它将增加QPS(每秒查询数?).代码示例显示了比较:
private static String content = “…94k…”;
protected doGet(…){
response.getWrite().print(content);
}
Run Code Online (Sandbox Code Playgroud)
private static String content = “…94k…”;
Private static byte[] bytes = content.getBytes();
protected doGet(…){
response.getOutputStream().write(bytes);
}
Run Code Online (Sandbox Code Playgroud)
谁能解释为什么它被优化了?我相信这是真的.
UPDATE
如果我引起任何误导.我需要解释原始演示文稿仅以此为例.他们实际上通过这种方式重构速度引擎.BUt这个源代码有点长.
实际上在演示文稿中并没有暗示他们如何详细地做到这一点.但我发现了一些领先优势.
在ASTText.java中,他们缓存了byte [] ctext而不是char [] ctext,这大大提升了性能〜!
就像上面的方式一样.这很有道理,对吧?
(但是他们肯定也应该重构Node接口.Writer不能写byte [].这意味着使用OutputStream代替!)
正如Perception所建议的那样,Write最终委托给StreamEncoder.而StreamEncoder写入将首先将char []更改为byte [].然后将其委托给OutputSteam进行实际写入.您可以轻松参考源代码并进行验证.考虑到每次显示页面时都会调用render方法,节省的成本将相当可观.
public class ASTText extends SimpleNode {
private char[] ctext;
/**
* @param id
*/
public ASTText(int id) {
super (id);
}
/**
* @param p
* …Run Code Online (Sandbox Code Playgroud) 我有以下代码来处理日期
SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss a");
String s = formatter.format(formatter.parse("10/11/2011 4:24:00 PM");
System.out.prinln(s);
Date d = (Date)formatter.parseObject(s);
System.out.println(d);
Run Code Online (Sandbox Code Playgroud)
第一个打印行输出是: 10/10/2011 00:00:00 AM
第二个是: Mon Oct 10 00:00:00 GMT+02:00 2011
我怎样才能使第二个语句与第一个语句一样打印出来?
问题是如何用这种格式创建日期对象?
我正在编码来解决这样的问题.大约有50到200个小文件.这些文件的总大小不会很大.我的目标是同时将它们加载到一个表中.
似乎代码运行得很好,它确实比使用单线程更快.
但是,我有点不确定.打开与文件号一样多的线程是否是最好的选择?
另一件事是我只用最简单的方法来做多线程.这也是最好的选择吗?
任何建议或意见表示赞赏!
for (int i = 0; i < threads.length; ++i) {
synchronized (threads[i]) {
threads[i].run();
}
}
for (int i = 0; i < threads.length; ++i) {
synchronized (threads[i]) {
try {
threads[i].join();
} catch (InterruptedException e1) {
return;
}
}
}
Run Code Online (Sandbox Code Playgroud) 当我编写一些API时,它有时会用作Collection<Model>参数.当然,ArrayList如果您知道ArrayList已经足够处理所有用例,您可以使用.
我的问题是ArrayList<Model>,Collection<Model>当传递参数时,例如施放时,是否存在相当大的性能成本.
收集尺寸是否也会影响铸造性能?有什么建议?
谢谢Peter的回答.
我认为答案足以阻止我浪费时间去改变它.
编辑
如在接受的答案中所述,实际上在调用接口方法时支付了成本.保持这种灵活性并不是免费的.但成本并不那么可观.