public class TestThread5 implements Runnable {
Timer timer = new Timer();
public static void main(String[] args) {
TestThread5 test = new TestThread5();
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 {
private static int num = 0;
public void add(String name) {
synchronized (this) {
num ++;
try {
Thread.sleep(10);
}catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name + ",你是第" +num +"个使用timer的线程");
}
}
}
输出结果:
t1,你是第1个使用timer的线程
t2,你是第2个使用timer的线程
public class TestThread5 implements Runnable {
Timer timer = new Timer();
public static void main(String[] args) {
TestThread5 test = new TestThread5();
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 {
private static int num = 0;
public void add(String name) {
//synchronized (this) //注释该语句
{
num ++;
try {
Thread.sleep(10);
}catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name + ",你是第" +num +"个使用timer的线程");
}
}
}
输出结果:
t1,你是第2个使用timer的线程
t2,你是第2个使用timer的线程
用心体会下这两个例子就会明白一些关于线程同步的问题。
锁定当前对象,也有另外一种表达方式:
class Timer {
private static int num = 0;
public synchronized void add(String name) {
//synchronized (this) //注释该语句
{
num ++;
try {
Thread.sleep(10);
}catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name + ",你是第" +num +"个使用timer的线程");
}
}
}
上述的意思是在执行当前代码的时候,当前对象已经被锁定,只有等待另外一个线程执行完了,才可以进行执行。
这叫做”互斥锁“,可以保证在同一时刻,只有一个线程进行访问同一个对象。