/*
*线程同步最基本的例子就是同一对象的某个方法被多人调用时,
*有可能第一个人访问到一半时,cpu调度了第二个人,
*以此类推,方法想要的结果意想不到。
*同步就是协同步调,按预定的先后次序进行运行。如:你说完,我再说。
*“同”字从字面上容易理解为一起动作
*其实不是,“同”字应是指协同、协助、互相配合。
*/
public class TestSync implements Runnable {
Timer timer = new Timer();
public static void main(String[] args) {
TestSync test = new TestSync();
Thread t1 = new Thread(test);
Thread t2 = new Thread(test);
t1.setName("t1");
t2.setName("t2");
t1.start();
t2.start();
}
@Override
public void run() {
timer.add(Thread.currentThread().getName());
}
}
class Timer {
public static int num;
public void add(String name) {
synchronized (this) {//锁定当前对象,锁定了当前对象了,里面的成员变量num肯定跟着锁定了,互斥锁
num++;
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name + "你是第" + num + "访问的人");
}
}
/*
public synchronized void add(String name) {//执行这个方法的过程中锁定当前对象
synchronized (this) {
num++;
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name + "你是第" + num + "访问的人");
}
}
*/
}