如何实现线程同步?

实现线程同步有三种方式:
1 同步代码块
synchronized(锁资源) {
需要同步执行的代码
}
解释:同步代码块会对资源加上资源锁,多线程访问的时候,需要先获取锁资源,并且没有拿到锁资源的线程需要等待锁资源的释放
锁资源:同一个锁资源才能实现线程同步
三种锁资源:
A this锁
B xx.class锁
C 字符串常量锁 String haha = “asd”;
测试类:

 public static void main(String[] args) throws Exception{	
	test1();	
}
 public static void test1() throws Exception {
	
	Ticket ticket = new Ticket();
	
	new Thread(ticket,"窗口A").start();
	new Thread(ticket,"窗口B").start();
	new Thread(ticket,"窗口C").start();   	
} 

Ticket类:

public class Ticket implements Runnable{	
private static int  count = 50;
//同步代码块
	@Override
	public void run() {		
		while (count > 0) {
			synchronized (this) {
			try {
				Thread.sleep(100);//线程休眠
					if(count>0){
						System.out.println(Thread.currentThread().getName()+"售票,出售第:"+count--+"张票");
					}
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			}
		}	
	}
}

2 同步方法

public class Ticket implements Runnable{
	private static int  count = 50;
	//同步方法
	 @Override
	public synchronized void run() {	
		while (count > 0) {
			try {		
				Thread.sleep(100);
				System.out.println(Thread.currentThread().getName()+"售票,出售第:"+count--+"张票");
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}	
		}		
	}
}

非静态同步方法使用的是this锁 相当于synchronized(this){ }
静态同步方法使用的是类锁 相当于synchronized(xx.class){ }
3 同步锁

public class Ticket implements Runnable{
private static int  count = 50;

private Lock  lock = new ReentrantLock();  
  public void run() {
	while (count > 0) {
		 try {
			Thread.sleep(100);
			lock.lock();//执行开始之前加锁
			if(count > 0) {
				System.out.println(Thread.currentThread().getName()+"售票,出售第:"+count--+"张票");							
			}						
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally{
			lock.unlock();//解锁
		}				    
	}	
  }
}
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值