解决方案 »
- 解压抛出来的错误java.lang.RuntimeException:data starting at 0 is in unknown format
- 关于引用与垃圾回收的问题,高手来!
- 循环里嵌套了线程,求验证
- 测试一个网络客户端、服务器程序之间的简单运算发生问题。
- jbuilder生成exe文件运行出错,请各位看看。
- 咱们这个论坛在线人数非常多,csdn是如何控制并发问题的?多人同时发表帖子.....
- 请教websphere应用服务与web服务的整合问题!高分相送!
- 我刚开始学习JAVA:一个最简单的JAVA程序出错,请帮忙!在线等,急急急急!谢谢了!给分
- 大哥大姐,小弟想知道那里有支持JAVA的免费服务器啊??
- SOS,一个JAVA初学者的苦衷!
- JAVA RMS 问题
- java gif 转jpg
比如一个银行数据库系统。A是取钱的,B是检查所取的钱是否大于存款的。
A{B,如果可以取钱,账户减去所取金额}B{判断要取的钱是否大于存款}
A1{B}A2{B}A1{取钱,账户更新}A2{取钱,账户更新}这样的话,存款就变成负的了。
不知道表达得是否清楚。第二个问题,第一个肯定是指向同一个对象的。第二个好像也是吧,以前好像看过类似的问题,不过由于不太关注细节,也不是非常确定。待高人指点。
{.....} 这种用法表明在一个时刻只能有一个对象调用该方法。
而你自己列出的两种是用对象作为锁,我们都知道在访问临界区资源时,要加锁,退出时再解锁;
而java里可以对对象的引用加锁,synchronized(o)中的o是一个对象的引用,线程在访问临界区资源时,会先访问对象o,如果此时o没有其他线程被加锁,则可以访问临界区资源,反之则等到该对象被解锁后才能访问。而下个问题,我先告诉你两种都指向了同一个对象,第一种new String()产生了对象s,而引用str指向了它,然后str1再指向了str,也就是指向了对象s。第二种:由于字符串常量是存储在池里的,当有新的字符串出现时,虚拟机将在池里寻找有无相同的字符串常量,若无,则生成新的对象,反之,则不会生成新的对象。所以两个引用str和str1都指向了池里的字符串常量。字符串也是一个对象。也可以调用String类中的方法。如果你想真正了解引用和对象的关系,先要关注它们如何存储在内存中的。
用了以下方法进行了测试package test;public class Test1{
public static void main(String[] args){
String str = "abc";
String str1 = str;
String str2 = "abc";
String str3 = "abcd";
String str4 = "abce";
System.out.println(str.hashCode());
System.out.println(str1.hashCode());
System.out.println(str2.hashCode());
System.out.println(str3.hashCode());
System.out.println(str4.hashCode());
}
}
运行结果一直是96354
96354
96354
2987074
2987075对str和str2,感觉应该是两个对象,是不是java对其进行了优化处理
或者我应该问,怎么才能建立两个值一样的String对象
谢谢你,关于String对象应该是明白了,但是synchronized还不是太了解
运行结果没问题,前三个都是同一个对象.
相同的"abc"只存在一个,str和str2引用的都是同一个对象
比如,String str1 = "abc";String str2 = "abc";
若String str2 = "aba";则不同,好像有个术语叫“什么池的”,不太记得了。
synchronized就是指该线程在执行时,不能中断。必须得该线程执行结束才能执行其他线程。
比如synchronized A{1;2;3},synchronized B{1;2;3}
则执行的时候可能是:A{1;2;3} B{1;2;3} B{1;2;3} A{1;2;3}
而如果没有的话,很可能A{1;2}B{1}A{3}B{2;3}B{1;2;3}A{1}B{1}A{2;3}B{2;3}
不知道这样解释,是否好理解一些呢?