线程同步处理

synchronized关键字可以定义同步方法或同步代码块,同步代码块的操作里只允许一个线程执行。

1.利用同步代码块进行处理

synchronized(同步对象) {
	同步代码操作;
}

一般进行同步对象处理时可采用当前对象this进行同步。

利用同步代码块解决数据同步访问问题
package synchronization;

public class Syntest {

	public static void main(String[] args) {
		MyThread mt=new MyThread();
		new Thread(mt,"售票A").start();
		new Thread(mt,"售票B").start();
		new Thread(mt,"售票C").start();
	}
}
class MyThread implements Runnable{
	private int ticket=10;
	@Override
	public void run() {
		synchronized(this) {//每一次只允许一个进程进行访问
			while(true) {
				if(this.ticket>0) {
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName()+"卖票:"+this.ticket--);
				}else {
					System.out.println("**********售空**********");
					break;
				}
			}
		}//
	}
}

加入同步处理后,程序的整体效率下降。同步可能会造成性能的降低。

2.利用同步同步方法解决:只需要在方法定义上使用synchronized关键字

package synchronization;

public class Syntest {

	public static void main(String[] args) {
		MyThread mt=new MyThread();
		new Thread(mt,"售票A").start();
		new Thread(mt,"售票B").start();
		new Thread(mt,"售票C").start();
	}
}
class MyThread implements Runnable{
	private int ticket=10;
	public synchronized boolean sale() {
		if(this.ticket>0) {
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(Thread.currentThread().getName()+"卖票:"+this.ticket--);
			return true;
		}else {
			System.out.println("**********售空**********");
			return false;
		}
	}
	@Override
	public void run() {
		while(this.sale());
	}
}

死锁

死锁:多个线程相互等待。
若干线程访问同一资源是要同步处理,而过多的同步会造成死锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值