多线程——同步函数

来源:互联网 发布:淘宝店如何转让 编辑:程序博客网 时间:2024/06/17 06:02
/*需求:银行有一个金库。有两个储户分别存300员,每次存100,存3次。目的:该程序是否有安全问题,如果有,如何解决?如何找问题:1,明确哪些代码是多线程运行代码。2,明确共享数据。3,明确多线程运行代码中哪些语句是操作共享数据的。*/class Bank{private int sum;//Object obj = new Object();public synchronized void add(int n){//synchronized(obj)//{sum = sum + n;try{Thread.sleep(10);}catch(Exception e){}System.out.println("sum="+sum);//}}}class Cus implements Runnable{private Bank b = new Bank();public void run(){for(int x=0; x<3; x++){b.add(100);}}}class  BankDemo{public static void main(String[] args) {Cus c = new Cus();Thread t1 = new Thread(c);Thread t2 = new Thread(c);t1.start();t2.start();}}
/*如果同步函数被静态修饰后,使用的锁是什么呢?通过验证,发现不在是this。因为静态方法中也不可以定义this。静态进内存是,内存中没有本类对象,但是一定有该类对应的字节码文件对象。类名.class  该对象的类型是Class静态的同步方法,使用的锁是该方法所在类的字节码文件对象。 类名.class*/class Ticket implements Runnable{private static  int tick = 100;//Object obj = new Object();boolean flag = true;public  void run(){if(flag){while(true){synchronized(Ticket.class){if(tick>0){try{Thread.sleep(10);}catch(Exception e){}System.out.println(Thread.currentThread().getName()+"....code : "+ tick--);}}}}elsewhile(true)show();}public static synchronized void show(){if(tick>0){try{Thread.sleep(10);}catch(Exception e){}System.out.println(Thread.currentThread().getName()+"....show.... : "+ tick--);}}}class  StaticMethodDemo{public static void main(String[] args) {Ticket t = new Ticket();Thread t1 = new Thread(t);Thread t2 = new Thread(t);t1.start();try{Thread.sleep(10);}catch(Exception e){}t.flag = false;t2.start();}}