public class TestSync2 implements Runnable {
int b = 100;
public static void main(String[] args) throws InterruptedException {
TestSync2 tt = new TestSync2();//锁的是实例对象
Thread t = new Thread(tt);//1
t.start();//2
tt.m2();//3
System.out.println("main thread b=" + tt.b);//4
//m1等m2的锁释放,步骤2和步骤4抢时间。
}
@Override
public void run() {
try {
m1();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//synchronized可以保证原子性,有序性,可见性
synchronized void m1() throws InterruptedException {
System.out.println("m1"+Thread.currentThread().getName());
b = 1000;
Thread.sleep(500);//6
System.out.println("b=" + b);
}
synchronized void m2() throws InterruptedException {
System.out.println("m2"+Thread.currentThread().getName());
Thread.sleep(250);//5
b = 2000;
}
}
程序输出结果
m2main
m1Thread-0
main thread b=2000(或者b=1000)
b=1000
PS:synchronized可以保证原子性,有序性,可见性
synchronized加锁,锁的是对象,
synchronized保证线程同步,通过时间来换取性能,synchronized块,保证一次只有一个线程进入到同步块,示例中锁的是实例对象tt,m1需要等m2释放同步锁,才可以执行。