线程同步和异步

多线程和同步 : 如进程、线程同步,可理解为进程或线程A和B一块配合,A执行到一定程度时要依靠B的某个结果,于是停下来,示意B运行;B依言执行,再将结果给A;A再继续操作。

所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回,同时其它线程也不能调用这个方法

 

多线程和异步:多线程可以做不同的事情,涉及到线程通知

 

 

   线程同步中的几个概念: 

 

1.使用同步块

synchronized(Object){

 

}

2.synchronized方法

 

3.同步锁Lock   用来锁代码的

Lock lc = new ReentrantLock();

lc.lock();

lc.unlock();

 

 

 

看下面的简单例题:

package com.iteye.com;

public class TestSync implements Runnable {
	  Tmer timer = new Tmer();
	  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 Tmer{
	  private static int num = 0;
	  public  void add(String name){ 
	  	//synchronized (this) {
		    num ++;
		    try {
		    	Thread.sleep(1);
		    } 
		    
		    catch (InterruptedException e) {
		    	
		    }
		    System.out.println(name+", 你是第"+num+"个使用timer的线程");
		  //}
	  }
	}

  很显然没有使用同步锁,会导致这个结果

      同步锁的作用就是在t1执行时,别的线程不能执行,这样才不会导致进程中的数据混乱,出现下面的错误

结果:
t1, 你是第2个使用timer的线程
t2, 你是第2个使用timer的线程

 

 

下面是加同步锁的:

package com.iteye.com;

public class TestSync implements Runnable {
	  Tmer timer = new Tmer();
	  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 Tmer{
	  private static int num = 0;
	  public synchronized void add(String name){ 
	  	//synchronized (this) {
		    num ++;
		    try {
		    	Thread.sleep(1);
		    } 
		    
		    catch (InterruptedException e) {
		    	
		    }
		    System.out.println(name+", 你是第"+num+"个使用timer的线程");
		  //}
	  }
	}

 

运行结果:

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

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

 

 

 

 

你可能感兴趣的:(线程同步,异步)