今天去逛javaworld.com.tw看到有人在问线程同步的问题,最近对多线程很感兴趣,写了不少类似的程序,所以线程同步也是肯定要用的到的,synchronized加在函数名称中间,我记得是对对象的同步,也就是说多线程如果想保持同步,必须保证这些线程用的是一个对象。看到过synchronized写到函数里面的,但是没得感受,今天测试了一把,把synchronized写到函数内部的,就不用保证一个对象了,所有的N个不同对象都可以。这个是代码看下截图吧。
先来个synchronized写到函数内部的
/** * */ package com.baseramework.core.thread; /** * 线程测试 * * @author sunyanan * */ public class ThreadTest { public static void main(String[] args) { Thread t1 = new Thread(new ExecuteThread()); Thread t2 = new Thread(new ExecuteThread()); t1.start(); t2.start(); } } /** * 任务类,来模拟我们的任务 * * @author sunyanan * */ class TaskClass { private TaskClass(){}; private static TaskClass t = new TaskClass(); public static TaskClass getInstance() { return t; } public synchronized void printData() { System.out.print(Thread.currentThread().getName() + ":"); for(int i = 0; i < 100; i++) { System.out.print(i + " "); } System.out.println(); } } /** * 线程类 * @author sunyanan * */ class ExecuteThread implements Runnable { TaskClass t = TaskClass.getInstance(); @Override public void run() { t.printData(); } }
运行结果截图:
可以看到2个线程是同步的来了,
再来看一下关键字写到内部的:
/** * */ package com.baseramework.core.thread; /** * 线程测试 * * @author sunyanan * */ public class ThreadTest { public static void main(String[] args) { Thread t1 = new Thread(new ExecuteThread()); Thread t2 = new Thread(new ExecuteThread()); t1.start(); t2.start(); } } /** * 任务类,来模拟我们的任务 * * @author sunyanan * */ class TaskClass { public void printData() { synchronized (TaskClass.class) { System.out.print(Thread.currentThread().getName() + ":"); for (int i = 0; i < 100; i++) { System.out.print(i + " "); } System.out.println(); } } } /** * 线程类 * @author sunyanan * */ class ExecuteThread implements Runnable { TaskClass t = new TaskClass(); @Override public void run() { t.printData(); } }
运行结果是和上面一样的,我就不多截图了。
再来对比下,关键字写到函数声明处,但是非一个对象的时候的代码:
/** * */ package com.baseramework.core.thread; /** * 线程测试 * * @author sunyanan * */ public class ThreadTest { public static void main(String[] args) { Thread t1 = new Thread(new ExecuteThread()); Thread t2 = new Thread(new ExecuteThread()); t1.start(); t2.start(); } } /** * 任务类,来模拟我们的任务 * * @author sunyanan * */ class TaskClass { public synchronized void printData() { System.out.print(Thread.currentThread().getName() + ":"); for(int i = 0; i < 100; i++) { System.out.print(i + " "); } System.out.println(); } } /** * 线程类 * @author sunyanan * */ class ExecuteThread implements Runnable { TaskClass t = new TaskClass(); @Override public void run() { t.printData(); } }
来看下结果:
可以看到是没有同步的哈。这样已经很清楚了,同步到底杂用的了。。
PS:明天开始考试,我什么都不会。。