java线程的静态变量共享问题
下面的输出结果可能是45; 90; 或 90;90 两种可能. 理论上static 静态变量不是被共享的吗? 会打印出90这个值说明static tick 变量确实是被共享的;
那么, 下面是我的分析:
出现90;90这个打印结果,是不是因为第一个线程执行完++到45,但还没来得执行System.out.println(Thread.currentThread().getName()+" : " + tick);. 第二个线程完成了++到了90, 这时候第一个线程再执行System.out.println(Thread.currentThread().getName()+" : " + tick); 就打印出90了. 然后第二个线程也当然是打印90!
最后,问题来了!!!! [cpu执行一个线程的run方法, 是不是不能保证一次性全部执行到结束!???]
那么, 下面是我的分析:
出现90;90这个打印结果,是不是因为第一个线程执行完++到45,但还没来得执行System.out.println(Thread.currentThread().getName()+" : " + tick);. 第二个线程完成了++到了90, 这时候第一个线程再执行System.out.println(Thread.currentThread().getName()+" : " + tick); 就打印出90了. 然后第二个线程也当然是打印90!
最后,问题来了!!!! [cpu执行一个线程的run方法, 是不是不能保证一次性全部执行到结束!???]
package java11;
class Ticket implements Runnable //extends Thread
{
private static int tick = 0;
@Override
public void run() {
for (int i=0; i<10; i++){
tick = tick+ i;
}
System.out.println(Thread.currentThread().getName()+" : " + tick);
}
}
class TicketDemo
{
public static void main(String[] args)
{
Ticket t1 = new Ticket();
Ticket t2 = new Ticket();
Ticket t3 = new Ticket();
Ticket t4 = new Ticket();
new Thread(t1).start();
new Thread(t2).start();
}
}
...全文
相关推荐
基于Java多线程同步技术的简易模拟售票系统实现.pdf
文档详细介绍了多线程的概念、如何在Java中创建线程、线程同步技术以及如何利用这些技术来解决共享资源访问时的数据一致性问题。
【Java】线程中哪些变量存在安全性问题
【Java】线程中哪些变量存在安全性问题
JAVAStatic静态变量.doc
此外,静态变量在多线程环境中需要注意同步问题,因为它们是所有线程共享的。如果不加以控制,可能会导致数据不一致或竞态条件。
Java 单例模式线程安全问题
线程安全问题通常是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的。
售票员大战.zip(Java运用静态变量多人销售票数进行分类)
Java之静态变量是编程中的一个重要概念,特别是在多线程环境下处理共享数据时。在Java中,静态变量属于类,而不是类的实例。这意味着无论创建了多少个对象,静态变量都只有一份拷贝,所有对象都能访问它。


Java SE
