多线程使用同步方法解决线程安全问题

仍然还是两个线程窗口卖票
当一次任务是在一个方法中完成的,那么我们可以将这个方法封装,即锁这个方法

如下是同步方法的代码;

/** * */
package com.yan;

/** * @author 雷雨 * */
public class TestThread {

	/** * @param args */
	public static void main(String[] args) {

		MyThread my1 = new MyThread("窗口一");
		MyThread my2 = new MyThread("窗口二");
		
		my1.start();
		my2.start();
	}

}
class MyThread extends Thread {
	private static TicketService ts = new TicketService();
	
	public MyThread(String name) {
		super(name);
	}

	public void run(){
		while(true) {
			if(ts.hasTicket()) {
				oneticketsale();
			}else {
				break;
			}
			
			
		}
	}
	//使用了同步方法的方式完成了线程
	public synchronized static void oneticketsale() {
		synchronized (ts) {
			if(ts.hasTicket()) {
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					// TODO 自动生成的 catch 块
					e.printStackTrace();
				}
				System.out.println(Thread.currentThread().getName()+"卖出了"+ts.sale());
			  }
			
		
		}
	}
	
		
}


注意
在分离要锁着的方法块的代码的时候,要分析那些部分的代码是线程***享的.

全部评论

相关推荐

我见java多妩媚:大外包
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务