javaSE 多线程,synchronized同步方法


Demo.java:

package cn.xxx.demo;
/*
 * 多线程并发访问同一个数据资源
 * 3个线程,对一个票资源,出售
 */
public class Demo {
	public static void main(String[] args) {
		//创建Runnable接口实现类对象
		Tickets t = new Tickets();
		//创建3个Thread类对象,传递Runnable接口实现类
		Thread t0 = new Thread(t);
		Thread t1 = new Thread(t);
		Thread t2 = new Thread(t);
		
		t0.start();t1.start();t2.start();
		
	}
}
Tickets.java(线程类,实现Runnable接口,重写run方法):
package cn.xxx.demo;
/*
 *  采用同步方法形式,解决线程的安全问题
 *  好处: 代码简洁
 *  将线程共享数据,和同步,抽取到一个方法中
 *  在方法的声明上,加入同步关键字synchronized
 *  
 *  问题:
 *    同步方法的对象锁是本类对象引用 this
 *    如果方法是静态,对象锁是本类类名.class 属性
 */
public class Tickets implements Runnable{  // 实现Runnable接口

	//定义出售的票源
	private  int ticket = 100;
	
	public void run(){  // 重写run方法
		while(true){
			payTicket();
		}
	}
	
	public synchronized void payTicket(){	// synchronized 同步方法。 对象锁是this。 同步静态方法的对象锁是类名.class 
		if( ticket > 0){
			try{
				Thread.sleep(10);
			}catch(Exception ex){}
			System.out.println(Thread.currentThread().getName()+" 出售第 "+ticket--);
		}
	}
}


猜你喜欢

转载自blog.csdn.net/houyanhua1/article/details/80736376