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

来源:互联网 发布:aria2 百度网盘windows 编辑:程序博客网 时间:2024/06/06 07:01

<原文地址: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 (??)当中滴问号。

0 0
原创粉丝点击