多线程和同步 : 如进程、线程同步,可理解为进程或线程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的线程