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

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

如下是同步方法的代码;

/**
 * 
 */
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());
			  }
			
		
		}
	}
	
		
}


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

发布了82 篇原创文章 · 获赞 26 · 访问量 3990

猜你喜欢

转载自blog.csdn.net/qq_40742223/article/details/104689059