<原文地址:http://blog.csdn.net/cnmm22/article/details/44273843>
看代码很累,特别看别人滴代码,又特别针对新人,但请你忍耐一下,看完这两个单独案例。
这两个个代码的功能一样,都是间断打印1、2、1、2……间隔1秒,这也是面试时非常 容易考到的一个问题。
代码1:
public class OutputThread implements Runnable {
private int num;
private Object lock;
public OutputThread(int num, Object lock) {
super();
this.num = num;
this.lock = lock;
}
public void run() {
try {
while(true){
synchronized(lock){
lock.notifyAll(); //注解1
lock.wait();
System.out.println(num);
}
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args){
final Object lock = new Object();
Thread thread1 = new Thread(new OutputThread(1,lock));
Thread thread2 = new Thread(new OutputThread(2, lock));
thread1.start();
thread2.start();
}
}
代码2:
package tank;public class test {
public static boolean flag=true;
public static void main(String[] args) {
String obj= new String();
new Thread(new A(obj)).start();
new Thread(new B(obj)).start();
}
}
class A implements Runnable {
String s= new String();
public A(String s){
this.s=s;
}
public void run() {
try {
while (true) {
synchronized(s){
s.notify();
s.wait();
Thread.sleep(1000);
System.out.println("1");
}}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class B implements Runnable {
String s= new String();
public B(String s){
this.s=s;
}
public void run() {
try {
while (true) {
synchronized(s){
s.notify(); //注解1
s.wait();
Thread.sleep(1000);
System.out.println("2");
}}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
现在仔细看每一句话:
1、不能没有s,就像代码1中不能没有lock。【lock是object,s甚至是string】这就是说明,我们任意new一个对象先,只要是object 就行,我们暂且叫它X,这个有用。
2、为啥要new这个对象?你们都知道,synchronized有两种写法,在方法里【public synchronized void Al() 】,在代码块里【 synchronized (??)】:在方法里不用穿参数,默认就是this——调用者就是X,而在代码块里,可以指定一个X,这个指定权在你。(所以方法里有局限)
3、用途:把X看成正在运行的线程(把对象看成线程??对,暂且这样看),X.wait,就是说X等,X.notify()叫醒。但一个程序可能有多个线程:假设有【 synchronized (X1)】【 synchronized (X2)】【 synchronized (X3)】,各管各,因为X,X1,X2,X3都被代码块synchronized 包围,他们会各自保护内部代码按单线程运行(就说可能有几个线程,他们都被标记X1,则他们看做X1一个线程)——他们各自内:运行-》wait等待-》notify叫醒-》运行-》wait等待-》……有人运行有人等待,大家总滴看就像一个线程,不再可能有多线程。而X,X1,X2,X3相互间依然交替进行似多线程。
综上,synchronized 滴作用:合并多个线程为一个单线程,怎样合并?你应该已经知道了,只靠synchronized (??)当中滴问号。