高并发

synchronized 同步锁

描述:又称线程同步;及多个线程共享一个 资源。出现资源竞争的问题。如我们生活中的火车抢票 秒杀商品等

同步方法

封装一个普通方法在run()外,并带入到run()中。
语法: public synchronized void 方法名(){
System.out.println(Thread.currentThread().getName()+"");
}

1.抢火车票 多个站台同时发售火车票,怎么能不卖重

package 线程同步;

public class MaiPiao implements Runnable{
	int count=100;

	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(count>0) {
			if(count<=0) {
				System.out.println("票卖完了");
				break;
			}
			aks();//封装的方法
			Thread.yield();
			
			
		}
		
		
	}
	public synchronized void aks() {
		System.out.println(Thread.currentThread().getName()+count+"张票");
		
		count --;
		
	}
	

}

测试类

package 线程同步;

public class MaiPiaoTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MaiPiao a=new MaiPiao();
		Thread t1=new Thread(a,"窗口一");
		t1.start();
		Thread t2=new Thread(a,"窗口二");
		t2.start();
		Thread t3=new Thread(a,"窗口三");
		t3.start();
		Thread t4=new Thread(a,"窗口四");
		t4.start();
		Thread t5=new Thread(a,"窗口五");
		t5.start();
		
		

	}
窗口一100张票
窗口五99张票
窗口五98张票
窗口五97张票
窗口五96张票
窗口五95张票
窗口五94张票
窗口五93张票
窗口五92张票
窗口五91张票
窗口五90张票
窗口五89张票
窗口五88张票
窗口五87张票
窗口五86张票
窗口五85张票
窗口五84张票
窗口五83张票
窗口五82张票
窗口五81张票
窗口五80张票
窗口五79张票
窗口五78张票
窗口五77张票
窗口五76张票
窗口五75张票
窗口五74张票
窗口五73张票
窗口五72张票
窗口五71张票
窗口五70张票
窗口五69张票
窗口五68张票
窗口五67张票
窗口五66张票
窗口五65张票
窗口五64张票
窗口五63张票
窗口五62张票
窗口五61张票
窗口五60张票
窗口五59张票
窗口五58张票
窗口五57张票
窗口五56张票
窗口五55张票
窗口五54张票
窗口五53张票
窗口五52张票
窗口五51张票
窗口四50张票
窗口四49张票
窗口四48张票
窗口四47张票
窗口四46张票
窗口四45张票
窗口四44张票
窗口四43张票
窗口四42张票
窗口四41张票
窗口四40张票
窗口四39张票
窗口四38张票
窗口四37张票
窗口四36张票
窗口四35张票
窗口四34张票
窗口四33张票
窗口四32张票
窗口四31张票
窗口四30张票
窗口四29张票
窗口四28张票
窗口四27张票
窗口四26张票
窗口四25张票
窗口四24张票
窗口四23张票
窗口四22张票
窗口四21张票
窗口四20张票
窗口四19张票
窗口四18张票
窗口四17张票
窗口四16张票
窗口四15张票
窗口四14张票
窗口四13张票
窗口四12张票
窗口四11张票
窗口四10张票
窗口四9张票
窗口四8张票
窗口四7张票
窗口四6张票
窗口四5张票
窗口四4张票
窗口四3张票
窗口四2张票
窗口一1张票
窗口三0张票
窗口二-1张票
窗口四-2张票
窗口五-3张票/*



*/

}

同步代码块

package 线程同步;

public class MaiPiao1 implements Runnable {
	int count =100;

	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(count>0) {
			if(count<=0) {
				break;
			}
			synchronized(this) {
			System.out.println(Thread.currentThread().getName()+count+"张票");
			}
			count--;
			Thread.yield();
			
		}
		
	}
	

}

测试类

package 线程同步;

public class MaiPiaoTest1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MaiPiao1 a=new MaiPiao1();
		Thread s1=new Thread(a,"窗口一");
		s1.start();
		Thread s2=new Thread(a,"窗口二");
		s2.start();
		Thread s3=new Thread(a,"窗口三");
		s3.start();
		Thread s4=new Thread(a,"窗口四");
		s4.start();
		Thread s5=new Thread(a,"窗口五");
		s5.start();
		
		

	}

}

注意同步锁的顺序,否则出错

  1. 俩小孩子抢5个苹果
  • while循环写到同步锁内,会出现其中一个小男孩一直能抢到苹果的情况
  • 睡眠时间不应改写在锁内,也会出错
package 线程同步;

public class Apple implements Runnable {
	int count =5;
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(count>0) {
		synchronized(this) {
		//while(count>0) {//这种情况会撑死  一直强
			if(count<=0) {
				break;
			}
			System.out.println(Thread.currentThread().getName()+"请到了"+count+"苹果");
			count--;
			
			
			
		}
		try {//不应该锁这个
			Thread.sleep(800);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	}

}

测试类

package 线程同步;

public class AppleTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Apple apple=new Apple();
		Thread t1=new Thread(apple,"小明");
		t1.start();
		Thread t2=new Thread(apple,"小红");
		t2.start();
	}
/*
小红请到了5苹果
小明请到了4苹果
小红请到了3苹果
小明请到了2苹果
小红请到了1苹果

*/
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值