java多线程-同步函数的锁

来源:互联网 发布:linux 删除文件夹失败 编辑:程序博客网 时间:2024/06/07 20:28
/* 通过分析打印出错误票多线程的运行出现了安全问题。 问题的原因:当多条语句在操作同一个线程共享数据时,一个线程对多条语句执行了一部分,还没有执行完另一个线程参与进来执行。导致共享数据的错误。解决办法:对多条操作共享数据的语句,只能让一个线程都执行完。在执行过程中,其他线程不能参与执行。java对多线程的安全的问题提供了专业的解决方式。同步代码块。synchronized(对象){     需要被同步的代码}同步函数。public synchronized void fun(){     需要被同步的代码块}同步函数用的哪一个锁函数需要被对象调用,那么函数都有一个所属对象的引用,就是this。所以同步函数使用的锁是this通过验证使用两个线程来买票一个线程在同步代码块中一个线程在同步函数中都在执行买票动作。如果同步函数被静态修饰后,使用的锁不是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()+"--synchronized : "+ tick--);}    }}}else{while(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 TicketTest{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();}}

0 0
原创粉丝点击