线程同步于死锁

来源:互联网 发布:java求日期之间的天数 编辑:程序博客网 时间:2024/05/04 08:19

同步:

package xianchengcaozuo;/** * 一个多线程的程序如果是通过RunnBer接口实现的,则意味着类中的属性被多个多线程共享 * ,这样就会出现资源同步的问题,例如卖票就可能出现负数的情况 * 所谓同步就是多个操作在同一时间段内,只能有一个线程进行,其它线程要等此程序结束后才能执行 * 解决同步资源共享操作: * 第一 使用同步代码块(注释代码部分) * 使用同步代码块必须制定一个需要同步的对象,一般把当前对象(this)设置为同步对象 * 第二 使用同步方法 * @author Administrator * */public class Tongbu {public static void main(String[] args) {Demo7 d1= new Demo7();Thread t1 = new Thread(d1);Thread t2 = new Thread(d1);Thread t3 = new Thread(d1);Thread t4 = new Thread(d1);Thread t5 = new Thread(d1);t1.start();t2.start();t3.start();t4.start();t5.start();}}class Demo7 implements Runnable{private int tacket=6;@Override//public void run() {//for(int i=0;i<50;i++){//同步代码块//synchronized (this) {//if(tacket>0){//try {//Thread.sleep(3000);//} catch (InterruptedException e) {//// TODO Auto-generated catch block//e.printStackTrace();//}//System.out.println("还有车票:"+tacket--);//}//}////}public void run() {for (int i = 0; i < 100; i++) {this.sale();}}//同步方法public synchronized void sale(){if (tacket > 0) {try {Thread.sleep(300);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("卖票:ticket = " + tacket--);}}}
死锁:

package xianchengcaozuo;/* * 同步可以保证资源操作的正确性,但是过多同步也会产生问题; * 例子:张三要王四的画,王四要张三的画,张三说:“王四把画给他,他的就给王四”, * 王四说张三给,他就把他的给张三。 * 这样导致的结果是谁也得不到谁的画,这就产生了死锁! * 所谓死锁就是2个程序都在等待彼此完成,导致的停滞 *  */public class MyThread19 implements Runnable {private static Zhangsan zs = new Zhangsan(); private static Lisi ls = new Lisi(); private boolean flag = false;public void run() {if (flag) {synchronized (zs) {zs.say();try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}synchronized (ls) {zs.get();}}}else {synchronized (ls) {ls.say();try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}synchronized (zs) {ls.get();}}}}public static void main(String[] args) {MyThread19 my1 = new MyThread19();MyThread19 my2 = new MyThread19();my1.flag = true;my2.flag = false;Thread th1 = new Thread(my1);Thread th2 = new Thread(my2);th1.start();th2.start();}}class Zhangsan {public void say(){System.out.println("张三对李四说:”你给我画,我就把书给你“。");}public void get(){System.out.println("张三得到了画。");}}class Lisi {public void say(){System.out.println("李四对张三说:”你给我书,我就把画给你“。");}public void get(){System.out.println("李四得到了书。");}}

运行结果:

李四对张三说:”你给我书,我就把画给你“。
张三对李四说:”你给我画,我就把书给你“。



0 0