Java 同步问题

/*
线程安全问题产生发原因:
1 多个线程在操作同一个数据
2 操作共享数据的线程代码有多条

当一个线程在执行操作共享数据的多条代码过程中 其他线程参与了运算
就会导致线程安全问题的产生


解决思路:
就是将多条操作共享数据的线程代码封装起来,当有线程在执行这些代码的时候
其他线程不可以参与运算
必须要当前线程把这些代码都执行完毕后,其他线程才可以参与运算

在Java中 用同步代码块就可以解决这个问题
同步代码块的格式:
synchronized(对象){
	需要被同步的代码;
}


同步的好处:解决了线程安全问题

同步的弊端:相对降低了效率 因为同步外的线程都会判断同步

*/

class Ticket implements Runnable{
	private  int num=100;
	Object obj=new Object();
	public void run(){
		while(true){ 
			synchronized(obj){//(锁) 同步这里面的代码块需要一起执行  类似火车卫生间 只能一次进一个
			if(num>0){//cpu 运行到这里 判断>0后 运行下一个线程 下一个线程将num--
					//cpu 回来时不需要判读>0(已经判断过了) 直接num-- 会出现-1 -2 (错误) 
				try{
					Thread.sleep(10);
				}
				catch(InterruptedException e){

				}
				System.out.println(Thread.currentThread().getName()+"--sale="+num--);
			}
			}
		}
	}
}
class ThreadDemo{
	public static void main(String[] args) {
		Ticket t=new Ticket();
		Thread t1=new Thread(t);
		Thread t2=new Thread(t);
		Thread t3=new Thread(t);

		t1.start();
		t2.start();
		t3.start();
	}
} 

你可能感兴趣的:(Java学习)