关闭

JAVA线程同步与死锁

标签: JAVA同步死锁
508人阅读 评论(0) 收藏 举报
分类:

         上一篇写到了JAVA初步认识线程,现在就说说自己对线程同步及死锁的认识。

      线程的同步,是为了避免多个线程访问相同的数据对象时,对数据造成破坏。

     下面模拟多个售票员销售同一列车的票。

一.同步

package thread;

public class MyThread  implements Runnable{
    private   int ticket=5;
   
	@Override
	public void run(){
		for(int i=1;i<=100;i++){
			this.sale();
		}
	}
	private  void sale(){
		if(ticket>0){
			try {
				Thread.sleep(1000);//卖票耗时模拟
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(Thread.currentThread().getName()+"卖出票 "+(ticket--));
		}
		  
	}
}

package thread;

public class ThreadClient {
	public static void main(String[] args) {
		MyThread t1=new MyThread();
		for(int i=0;i<10;i++){
			new Thread(t1,"售票员"+(i+1)).start();
		}
	}
}


运行结果:

售票员1卖出票 4
售票员3卖出票 5
售票员5卖出票 3
售票员2卖出票 2
售票员4卖出票 1
售票员6卖出票 0
售票员8卖出票 -1
售票员10卖出票 -2
售票员7卖出票 -3
售票员9卖出票 -4
售票员1卖出票 -5
售票员3卖出票 -6
售票员5卖出票 -7
售票员2卖出票 -8

         看运行结果,居然出现了负数,这明显不符合实际。简单分析下。

(1)假如售票员1查看ticket,发现ticket=1,还可以继续出售,但卖票需要填写一些数据什么的,需要话费时间。

(2)售票员1还在填写票据,1号票还没卖出。此时售票员2也查看了下ticket,发现ticket=1,他认为还可以继续出售(他不知道售票员1准备出售1号票)他也准备填写票据了。

(3)在售票员2在填写出售1号的数据时,售票员1完成了填写出售1号票的数据,并将它出售了,ticket=0了,没票出售了(但是售票员2不知道)

(4)售票员2填写完数据了,让电脑打印票,这是才发现票上面写的居然是0了

 

       这种情况就是所谓的线程不安全。那么可以使用synchronized,对出售票的动作进行加锁,在同一个时间点,只允许一个人在卖票。

package thread;

public class MyThread  implements Runnable{
    private   int ticket=5;
   
	@Override
	public void run(){
		for(int i=1;i<=100;i++){
			this.sale();
		}
	}
	private synchronized  void sale(){
		if(ticket>0){
			try {
				Thread.sleep(1000);//卖票耗时模拟
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(Thread.currentThread().getName()+"卖出票 "+(ticket--));
		}
		  
	}
}




package thread;

public class ThreadClient {
	public static void main(String[] args) {
		MyThread t1=new MyThread();
		for(int i=0;i<10;i++){
			new Thread(t1,"售票员"+(i+1)).start();
		}
	}
}


 

运行结果

售票员2卖出票 5
售票员2卖出票 4
售票员9卖出票 3
售票员7卖出票 2
售票员7卖出票 1


     运行结果符合实际了。

二、死锁

       使用synchronized可以解决同步问题,但是如果使用不当,会发生死锁问题。

       画画需要笔和纸。张三和李四同时想画画,张三拿到了笔,李四拿到了纸。张三在等李四给纸他,李四在等张三给笔他。于是他们两人都在等待。这就是死锁了。

package thread;

public class Pane {

	public String toString(){
		return "神奇的七彩笔.........";
	}
	
}
package thread;

public class Paper {

	public String toString(){
		return "白花花的画纸......";
	}
	
}


 

package thread;

public class DeadLockTest {

	public static void main(String[] args) {
		DrawPicture zs=new DrawPicture("张三");
		DrawPicture ls=new DrawPicture("李四");
		new Thread(zs).start();
		new Thread(ls).start();
	}
}


运行结果

李四得到了白花花的画纸......
张三得到了神奇的七彩笔.........

     程序打印了上面两个结果后,就卡住了(是2个线程都在等待,进入了堵塞状态)。张三和李四谁也不能完成画画。。。。都在等待对方,给资源。

 

 
 
 
 
 
 
 
 

 

0
0
查看评论

Java 线程同步与死锁 学习笔记

Java 线程同步与死锁 学习笔记Java 线程同步与死锁 学习笔记 1 多线程共享数据 2 线程同步 3 同步准则 4 线程死锁 1、 多线程共享数据 在多线程操作中,多个线程可能同时处理同一个资源,这就是多线程中的共享数据。如:在对数据库进行操作中,有可能同时会有多个线程同时对某个数据进行操作 ...
  • haha_zhan
  • haha_zhan
  • 2016-09-25 10:02
  • 1069

Java多线程 线程同步与死锁

1.线程同步多线程引发的安全问题一个非常经典的案例,银行取钱的问题。假如你有一张银行卡,里面有5000块钱,然后你去银行取款2000块钱。正在你取钱的时候,取款机正要从你的5000余额中减去2000的时候,你的老婆正巧也在用银行卡对应的存折取钱,由于取款机还没有把你的2000块钱扣除,银行查到存折里...
  • kong_gu_you_lan
  • kong_gu_you_lan
  • 2017-02-25 15:47
  • 834

多线程同步与死锁深入分析

多线程同步与死锁深入分析 前言 在多线程开发中,同步与死锁是非常重要的,在本篇文章中,读者将会明白一下几点: 1、哪里需要同步 2、如何实现同步 3、以及实现同步之后会有哪些副作用 例子 问题的引出 以买火车票为例,如果现在要是想买火车票的话可以去火车站买或者各个售票点,但是不管...
  • yangwenxue_admin
  • yangwenxue_admin
  • 2016-04-10 17:53
  • 1884

Java 多线程同步与死锁

在多线程中如何找到安全问题所在: 1,明确哪些代码是多线程运行代码 2,明确共享数据 3,明确多线程运行代码中哪些代码是操作共享数据的 静态的同步方法中,使用锁是该方法所在类的字节码文件对象,即 类名.class  前天俺们谈到了加锁,但是在使用加锁的...
  • pjz90
  • pjz90
  • 2013-03-10 14:51
  • 6026

Java线程同步与死锁(死锁)

class A { public synchronized void say(B b) { System.out.println(&quot;渣渣辉说:辣鸡!来爆我装备啊笨!&quot;); b.get(); } public synchronized void ge...
  • ikv1989
  • ikv1989
  • 2018-02-12 17:22
  • 12

一些防止多线程同步造成死锁的技巧

  • xiaoyafang123
  • xiaoyafang123
  • 2016-12-06 11:55
  • 488

Java多线程,线程同步synchronized,线程死锁【线程池常规用法】多线程并发处理

工作内容: 1.线程同步:synchronized (锁类) 2.线程死锁 3.生产者与消费者模式 4.线程练习 线程同步: Synchronized(Object){ 代码块 } Public static synchronized void method(){ 代码块 } 尽量用在最细致的...
  • yingtian648
  • yingtian648
  • 2016-07-14 09:01
  • 374

Java线程同步与死锁认识

讲下自己的认识,算小小的总结吧! synchroized 具有同步线程的功能,它的处理机制类似于给参数里面的对象赋一个标记值,来表明当前状态,当程序里面某个线程执行synchroized里面的代码段时,它会先对这个状态进行判断,如果处于0这种状态,它会暂时被阻塞,所以能有效防止数据错误的产生。 ...
  • k183000860
  • k183000860
  • 2015-05-21 13:21
  • 231

java 多线程学习笔记2-同步代码块,死锁

1、多线程-同步代码块:synchronized     当多线程并发, 有多段代码同时执行时, 我们希望某一段代码执行的过程中CPU不要切换到其他线程工作. 这时就需要同步。     如果两段代码是同步的, 那么同一时间只能执行一段, 在一段代码...
  • gaopinqiang
  • gaopinqiang
  • 2016-12-18 15:08
  • 652

【线程同步】java实现生产者消费者问题与线程中的wait与notify总结

JAVA解决线程模型有三种方式,只讲一种:   1、wait()和notify()
  • robert_lizhiqiang
  • robert_lizhiqiang
  • 2014-09-15 14:41
  • 1131
    个人资料
    • 访问:355222次
    • 积分:4641
    • 等级:
    • 排名:第7530名
    • 原创:130篇
    • 转载:94篇
    • 译文:0篇
    • 评论:63条
    最新评论