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 = 0
B----out:0
B----in:
B thread run i = 1;value = 1
B----out:1
B----in:
B thread run i = 2;value = 2
B----out:2
去掉B中的同步,或换为Object,结果如下:
A----in:
B----in:
A thread run i = 0;value = 0
B thread run i = 0;value = 1
A----out:0
B----out:1
A----in:
B----in:
A thread run i = 1;value = 2
B thread run i = 1;value = 3
B----out:3
B----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++);
}
}
}
}