您的位置:首页 > 编程语言 > Java开发

若还 不懂 java synchronized 同步,锁,对象wait,notify问题,看完这两段代码,解决问题。

2015-03-15 05:24 645 查看
<原文地址: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 (??)当中滴问号。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: