05_线程同步

引入:两人同时取同一账户的钱 两个线程访问同一资源,进程之间协调的问题

解决:在进程访问独占资源时先锁定再访问 synchronized 最好只锁定一个对象

加锁过程中:一个方法做了同步(加锁)另一个方法没有做同步,别的线程可以访问没做同步的方法,并且能影响已经同步的方法,要保护需要的同步的对象,必须对要访问的对象所有方法要仔细考虑加不加同步,加同步效率变低,不加同步有可能产生数据不一致的后果

读写两方法,写的方法加锁。

两个方法都改了同一个值,两个方法都应该加同步


05_线程同步_第1张图片


public class TestSync implements Runnable {
	Timer timer = new Timer();
	public static void main(String args[]){
		TestSync test = new TestSync();
		Thread t1 = new Thread(test);  //创建了两个线程, 一条路分成了两条
		Thread t2 = new Thread(test);
		t1.setName("t1");
		t2.setName("t2");
		t1.start();
		t2.start();
	}
	public void run(){
		timer.add(Thread.currentThread().getName());
	}
}

class Timer{
	private static int num = 0;
	public void add(String name){
		num ++;
		try{
				Thread.sleep(1);
		}catch (InterruptedException e) {}
			System.out.println(name+",你是第" + num +"个使用timer的线程");
		
		
		
		}
	}
输出:

t2,你是第1个使用timer的线程
t1,你是第2个使用timer的线程
05_线程同步_第2张图片


改掉其中一段代码

class Timer{
	private static int num = 0; //改成1,   输出会出现3
	public void add(String name){  
		synchronized(this){   //锁,就可以把上面的 num成员变量给锁住
		num ++;
		try{
				Thread.sleep(1);
		}catch (InterruptedException e) {}
			System.out.println(name+",你是第" + num +"个使用timer的线程");
		}
		
		}
	}

就可以输出:

t1,你是第1个使用timer的线程
t2,你是第2个使用timer的线程

你可能感兴趣的:(thread,timer,String,Class)