实现Runnable接口实现多线程,实现资源共享

Scaarf 2017-11-08 08:03:22
不是说实现Runnable接口能实现共享么,为啥我这个运行出来有重复的结果出现。。。。。还是我哪写的不对


class A implements Runnable{
private static int totalTicketNumber=100;//总票数
private String name;
public A(String name) {
this.name=name;
}

@Override
public void run() {
for (int j = 0; j < 5; j++) {
totalTicketNumber--;
System.out.println(totalTicketNumber);
}
}

public static void main(String[] args) throws InterruptedException {
String name="线程";
A a=new A(name);
for (int i = 1; i <= 5; i++) {
Thread t=new Thread(a);
t.start();
}
}

}
...全文
236 4 点赞 打赏 收藏 举报
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复

public class A implements Runnable{
    private static AtomicInteger atomInteger = new AtomicInteger(0);//总票数
    private static int total = 0;
    
    private String name;
    public A(String name) {
        this.name=name;
    }
    
    public int decrement() {
    	return atomInteger.decrementAndGet();
    }
    
    @Override
    public void run() {
        for (int j = 0; j < 5; j++) {
            decrement();
            total -- ;
        }
    }
    
    public static void main(String[] args) throws InterruptedException {
        for (int i = 1; i <= 10000; i++) {
        	String name="线程" + i;
        	A a=new A(name);
            Thread t=new Thread(a);
            t.start();
        }
        
        Thread.sleep(5000L);
        System.out.println("atomInteger : " + atomInteger.get());
        System.out.println("int : " + total);
    }
}
-- / ++ 都不是线程安全的,你的totalTicketNumber可以用AtomicInteger代替,或者像楼上一样加锁
  • 打赏
  • 举报
回复
一个帅逼 2017-11-09
class A implements Runnable{
    private static int  totalTicketNumber=100;//总票数
    private String name;
    public A(String name) {
        this.name=name;
    }
     
    @Override
    public void run() {
        for (int j = 0; j < 5; j++) {
            try {
            	Thread.sleep(1000);
            } catch (InterruptedException e) {
			// TODO Auto-generated catch block
            	e.printStackTrace();
            }
        	synchronized (this) {
                totalTicketNumber--;
                System.out.println(Thread.currentThread().getName()+" "+totalTicketNumber);
        	} 

		  }
    	}
     
    public static void main(String[] args) throws InterruptedException {
        String name="线程";
        A a=new A(name);
        for (int i = 1; i <= 5; i++) {
            Thread t=new Thread(a,"线程"+i);
            t.start();
        }   

    }
     
}
可以改成这样
  • 打赏
  • 举报
回复
一个帅逼 2017-11-09
你需要用synchronized来控制线程同步
  • 打赏
  • 举报
回复
不佑天 2017-11-08
由于多线程交替运行totalTicketNumber--后可能会切换到其他线程,等切换回来时totalTicketNumber的值已经改变了
  • 打赏
  • 举报
回复
相关推荐
发帖
Java SE
加入

6.2w+

社区成员

Java 2 Standard Edition
申请成为版主
帖子事件
创建了帖子
2017-11-08 08:03
社区公告
暂无公告