编写了一个JAVA的售票小程序,多线程实现售票系统,但却无法实现两个线程共享资源,是怎么回事?请指教。
CLASSA{publicstaticvoidmain(String[]args){Btesta=newB();Threadtestb=newThread(testa);...
CLASS A {
public static void main(String[]args){
B testa=new B();
Thread testb=new Thread(testa);
new Thread(testb).start();
new Thread(testb).start();
}}
CLASS B Implements Runnable{
int tickets=100;
Synchronized void run(){
while(true){
if(tickets>0){
System.out.println(Thread.currentThread().getName()+"is sailing"+tickets);
tickets--;}}}
运行的结果不是两个线程共用tickets=100的资源,而是每个线程产生tickets=100共200张票,怎么回事?
但是在加public static 修饰时,eclipse 却提示修饰符不合法,只能用终态。 展开
public static void main(String[]args){
B testa=new B();
Thread testb=new Thread(testa);
new Thread(testb).start();
new Thread(testb).start();
}}
CLASS B Implements Runnable{
int tickets=100;
Synchronized void run(){
while(true){
if(tickets>0){
System.out.println(Thread.currentThread().getName()+"is sailing"+tickets);
tickets--;}}}
运行的结果不是两个线程共用tickets=100的资源,而是每个线程产生tickets=100共200张票,怎么回事?
但是在加public static 修饰时,eclipse 却提示修饰符不合法,只能用终态。 展开
1个回答
展开全部
两个线程(假设为a,b)不共享资源是由于变量是局部变量。
就是线程a下有一个tickets,
线程b下也有一个tickets,
这时tickets变量为2个。
线程a访问的是a下的tickets,
而线程b访问的是b下的tickets,
所以造成了出票结果为200张。
为了避免这种情况,需要在声明的时候把他设置成全局变量
也就是前面要加入static修饰
把int tickets=100;
修改为public static int tickets=100;
这时无论生成几个线程tickets变量只有一个所有的线程同时对他执行操作。
这时就能保证出票数为100张了
就是线程a下有一个tickets,
线程b下也有一个tickets,
这时tickets变量为2个。
线程a访问的是a下的tickets,
而线程b访问的是b下的tickets,
所以造成了出票结果为200张。
为了避免这种情况,需要在声明的时候把他设置成全局变量
也就是前面要加入static修饰
把int tickets=100;
修改为public static int tickets=100;
这时无论生成几个线程tickets变量只有一个所有的线程同时对他执行操作。
这时就能保证出票数为100张了
追问
但是在加public static 修饰时,eclipse 却提示修饰符不合法,只能用终态。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询