多线程之同步和死锁

在多线程的开发中, 同步与死锁的概念非常重要


我需要知道的是 那里需要同步 
                如何实现同步 代码了解即可

以及实现同步之后 有哪些副作用

接下来以买火车票为例

package ThreadTest;
class Tong implements Runnable{
	private int ticket=5;
	public void run() {
		
		for (int i = 0; i < 100; i++) {
			if (ticket>0) {//还有票
				try {
					Thread.sleep(1000);//加入yanchi
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				System.out.println("卖票:ticket="+ticket--);
			}
		}
	}
	
}

public class TongBuDemo {
	public static void main(String[] args) {
		Tong tong=new Tong();//定义线程对象
		Thread t1=new Thread(tong);//定义Thread实例
		Thread t2=new Thread(tong);
		Thread t3=new Thread(tong);
		t1.start();
		t2.start();
		t3.start();
	}
	
	
}

出现了负数  说明那个地方出错了 相信大家 也看了 这个程序分为两个步骤



这时候就需要用同步代码块 同步就是指:多个操作在同一个时间段内只能有一个线程

其他线程只有等这个线程技术才能执行


代码块上加入synchronized关键字 就是同步代码块


package ThreadTest;
class Tong implements Runnable{
	private int ticket=5;
	public void run() {
		
		for (int i = 0; i < 100; i++) {
			synchronized (this) {//要对当前对象进行同步
				if (ticket>0) {//还有票
					try {
						Thread.sleep(1000);//加入yanchi
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					System.out.println("卖票:ticket="+ticket--);
				}
			}
			
		}
	}
	
}

public class TongBuDemo {
	public static void main(String[] args) {
		Tong tong=new Tong();//定义线程对象
		Thread t1=new Thread(tong);//定义Thread实例
		Thread t2=new Thread(tong);
		Thread t3=new Thread(tong);
		t1.start();
		t2.start();
		t3.start();
	}
	
	
}

这样大家都看的出效率降低了好多
还有一种方法  synchronized关键字将一个方法声明成同步方法
synchronized 方法返回值 方法名称(参数列表){}


package ThreadTest;
class Tong implements Runnable{
	private int ticket=5;
	public void run() {
		
		for (int i = 0; i < 100; i++) {
//			synchronized (this) {//要对当前对象进行同步
				
				this.sale();
			
			
			
		}
	}
	private synchronized void sale() {
		if (ticket>0) {//还有票
			try {
				Thread.sleep(300);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println("卖票:ticket="+ticket--);
		}
	}
	
}

public class TongBuDemo {
	public static void main(String[] args) {
		Tong tong=new Tong();//定义线程对象
		Thread t1=new Thread(tong);//定义Thread实例
		Thread t2=new Thread(tong);
		Thread t3=new Thread(tong);
		t1.start();
		t2.start();
		t3.start();
	}
	
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值