谁能帮我解释一下这是什么情况。
————————————————————————————————————————public class MyTest extends Thread{
public static void main(String[] args) {
new MyTest().start();
new MyTest().start();
}
public void run(){
Singleton singleton=Singleton.getInstance();
try{
sleep(1000);
singleton.test();
}catch(InterruptedException e){
}
}
}
————————————————————————————————————————
public class Singleton {
private static Singleton singleton=new Singleton();
private int no;
private Singleton(){
this.no=0;
}
public static Singleton getInstance(){
return singleton;
}
public void test(){
for(int i=0;i<10;i++){
System.out.println(no);
no++;
}
}
}
————————————————————————————————————————
结果:
0
1
2
3
4
5
6
7
8
9
0——————————谁能解释下这里为什么不是10?
11
12
13
14
15
16
17
18
19谁能告诉我原理 谢谢
多线程单例模式javaSingleton
————————————————————————————————————————public class MyTest extends Thread{
public static void main(String[] args) {
new MyTest().start();
new MyTest().start();
}
public void run(){
Singleton singleton=Singleton.getInstance();
try{
sleep(1000);
singleton.test();
}catch(InterruptedException e){
}
}
}
————————————————————————————————————————
public class Singleton {
private static Singleton singleton=new Singleton();
private int no;
private Singleton(){
this.no=0;
}
public static Singleton getInstance(){
return singleton;
}
public void test(){
for(int i=0;i<10;i++){
System.out.println(no);
no++;
}
}
}
————————————————————————————————————————
结果:
0
1
2
3
4
5
6
7
8
9
0——————————谁能解释下这里为什么不是10?
11
12
13
14
15
16
17
18
19谁能告诉我原理 谢谢
多线程单例模式javaSingleton
解决方案 »
- mybatis 联表查询的问题
- JavaEE的版本问题
- java压缩字符串问题!!!!!!!!!!!!!!!!!!@!#@¥#¥!@#@!#@!¥@!¥@!@!#%……&……&¥%
- 求救啊!真的没办法了! javax/el/ELResolver
- 怎么让 服务器 共用一个端口
- S2SH 整合cxf
- Couldn't find a destory method named 'close' on bean with name 'sessionFactory'
- 请问Struts-config.XML文件中能否实现动态地从Session中取得值赋给<forward>
- Eclipse整合Tomcat做第一个Struts遇到的问题
- Java从远程接口获取token后如何验证登陆另一个项目
- 谁有ssh的例子 要详细说明的 谢谢
- 关于【jdbc.properties】cannot be opened because it does not exist
public class Singleton {
private static Singleton singleton=null;
private int no;
private Singleton(){
this.no=0;
}
public static Singleton getInstance(){
if(singleton==null){
synchronized (Singleton.class) {
if(singleton==null){
singleton=new Singleton();
}
}
}
return singleton;
}
public void test(){
for(int i=0;i<10;i++){
System.out.println(no);
no++;
}
}
}
得出的结果是一样的
public class Singleton {
private static Singleton singleton=null;
private int no;
private Singleton(){
this.no=0;
}
public static Singleton getInstance(){
if(singleton==null){
synchronized (Singleton.class) {
if(singleton==null){
singleton=new Singleton();
}
}
}
return singleton;
}
public void test(){
for(int i=0;i<10;i++){
System.out.println(no);
no++;
}
}
}
得出的结果是一样的test方法加个锁
public synchronized void test(){
for(int i=0;i<10;i++){
System.out.println(no);
no++;
}
}
private int no;改成
public static int no;就是10了
______________________________________
原来的no 就是static的,也会出现上面的情况
public class Singleton {
private static Singleton singleton=null;
private int no;
private Singleton(){
this.no=0;
}
public static Singleton getInstance(){
if(singleton==null){
synchronized (Singleton.class) {
if(singleton==null){
singleton=new Singleton();
}
}
}
return singleton;
}
public void test(){
for(int i=0;i<10;i++){
System.out.println(no);
no++;
}
}
}
得出的结果是一样的test方法加个锁
public synchronized void test(){
for(int i=0;i<10;i++){
System.out.println(no);
no++;
}
}————————————————————————————
想点引用的,不小心扔了块砖,不好意思啊…………
结果是没有问题的
但如果每次调用这个方法都要同步的话,代价是不是很大呀。有没有更牛逼,实际可行的方法或者思路呢。
其实我更想知道no再次初始化之后的数据怎么还会正常接着10往后跑。
好吧,我错了,这样还是有问题的。。
参考了CopyOnWriteArrayList的写法,虽然用特别的关键字volatile transient修饰数组,但是在涉及线程安全的地方,还是使用了synchronized关键字修饰了方法。
public class Singleton {
private static Singleton singleton=null;
private int no;
private Singleton(){
this.no=0;
}
public static Singleton getInstance(){
if(singleton==null){
synchronized (Singleton.class) {
if(singleton==null){
singleton=new Singleton();
}
}
}
return singleton;
}
public void test(){
for(int i=0;i<10;i++){
System.out.println(no);
no++;
}
}
}
得出的结果是一样的
synchronized在这里有什么关系??完全没用啊,你加到test()方法上去试试