synchronized (class):class类的同步,同步的时候会同步整个class
与
synchronized (Object):Object的同步,只对其中的对象同步
如下:对类B中的同步代码块的同步,对比之后放可明白
synchronized (MyThread.class)
例:
A:类UnsafeSequence
public class UnsafeSequence {
private static int value; public int getValue() { synchronized (UnsafeSequence.class) { return value++; } } public int getValueA() { synchronized (this) { return value++; } }}B:类MyThread
public class MyThread implements Runnable {
private UnsafeSequence unsafe; private static int value; @Override public void run() { unsafe = new UnsafeSequence(); for(int i = 0; i < 60; i++) { synchronized (MyThread.class) { System.out.println(Thread.currentThread().getName() + "----in:"); System.out.println(Thread.currentThread().getName() + " thread run i = " + i + ";value = " + unsafe.getValue()); System.out.println(Thread.currentThread().getName() + "----out:" + value++); } } }}C:主函数
public class TestMain {
public static void main(String[] args) { MyThread target_1 = new MyThread(); MyThread target_2 = new MyThread(); Thread thread_1 = new Thread(target_1, "A"); Thread thread_2 = new Thread(target_2, "B"); thread_1.start(); thread_2.start(); }}
结果如下:
B----in:
B thread run i = 0;value = 0B----out:0B----in:B thread run i = 1;value = 1B----out:1B----in:B thread run i = 2;value = 2B----out:2
去掉B中的同步,或换为Object,结果如下:
A----in:
B----in:A thread run i = 0;value = 0B thread run i = 0;value = 1A----out:0B----out:1A----in:B----in:A thread run i = 1;value = 2B thread run i = 1;value = 3B----out:3B----in:A----out:2
控制同步:
public class MyThread implements Runnable {
private UnsafeSequence unsafe; private static int value; @Override public void run() { synchronized (MyThread.class) { unsafe = new UnsafeSequence(); for(int i = 0; i < 60; i++) { System.out.println(Thread.currentThread().getName() + "----in:"); System.out.println(Thread.currentThread().getName() + " thread run i = " + i + ";value = " + unsafe.getValue()); System.out.println(Thread.currentThread().getName() + "----out:" + value++); } } }}
posted on 2016-03-07 23:38 阅读( ...) 评论( ...)