从别人的文章里偷来一句话,感觉蛮经典的:多线程的同步依靠的是锁机制,java中可通过synchronized关键字锁锁住共享资源以实现异步多线程的达到同步。
总结起来,要达到同步,我们要做的就是构造各线程间的共享资源,其中的共享资源可以对象,也可以是方法。
学习过程中整的一个多线程实现同步的Demo:
package com.jd.test.demo;public class LockDemo { public static void main(String[] args) { MyRunnerVarLock runnerVarLock = new MyRunnerVarLock(new Integer(0)); MyRunnerFuncLock runnerFuncLock = new MyRunnerFuncLock(); MyRunnerNoLock runnerNoLock = new MyRunnerNoLock(); // 对共享对象进行加锁,线程会依次打印0-99的数,每一次运行的结果都一样 for(int i = 0; i < 10; i++) { Thread thread = new Thread(runnerVarLock); thread.start(); } // 对共享函数进行加锁,线程会依次打印0-99的数,每一次运行的结果都一样 for(int i = 0; i < 10; i++) { Thread thread = new Thread(runnerFuncLock); thread.start(); } // 未加锁,会因为线程调用的时序不同而发生变化,每一次运行的结果不一定相同 for(int i = 0; i < 10; i++) { Thread thread = new Thread(runnerNoLock); thread.start(); } }}// 对共享对象进行加锁class MyRunnerVarLock implements Runnable { private Object lock; public MyRunnerVarLock(Object lock) { this.lock = lock; } public void run() { synchronized (lock) { for (int i = 0; i < 100; i++) { System.out.println("Lock: " + i); } } }}// 对共享函数进行加锁class MyRunnerFuncLock implements Runnable { public synchronized void run() { for (int i = 0; i < 100; i++) { System.out.println("Func lock: " + i); } }}// 没有加锁class MyRunnerNoLock implements Runnable { public void run() { for (int i = 0; i < 100; i++) { System.out.println("No lock: " + i); } }}哈哈,有点水,不得深解,能用万岁^_^!!!!