Java基础_线程_多线程

来源:互联网 发布:炫浪网络社区下载 编辑:程序博客网 时间:2024/05/31 13:14

六、线程的同步

snchronized执行这个方法的过程中当前对象被锁定

在Java语言中,引入了对象互斥锁的概念,保证共享数据操作的完整性。每个对象都对应于一个可称为“互斥锁”的标记,这个标记保证在任意时刻,只能有一个线程访问该对象。

关键字synchronized来与对象的互斥锁联系。当某个对象被synchronized修饰时,表名该对象在任一时刻只能由一个线程访问。

publicclassSynchronizedTestimplements Runnable {

    Timer t = new Timer();

    publicstaticvoid main(String[] args) {

        SynchronizedTest sync = new SynchronizedTest();

        Thread t1 = newThread(sync);

        Thread t2 = newThread(sync);

        t1.setName("thread1");

        t2.setName("thread2");

        t1.start();

        t2.start();

        /* 因为首先将count++,所以第一个线程调用add方法,将count自加为1,并进行睡眠

         *  之后第二个线程调用add方法,将count自加为2,并进行睡眠

         *  这也就造成了最后输出的时候,结果两个线程打印的语句count都为2

         * thread1你是第2调用该线程的!

            thread2你是第2调用该线程的!

         */

    }

    publicvoid run(){

        t.add(Thread.currentThread().getName());

    }

}

class Timer {

    privatestaticintcount = 0;

    publicvoidadd(String threadName) {

        count++;

        try {

            Thread.sleep(1000);//这里睡眠1秒钟,是为了让输出更明显,如果不睡眠实际中也会出现这种情况

        } catch(InterruptedException e) {

            e.printStackTrace();

        }

        System.out.println(threadName+"你是第" +count +"调用该线程的!");

    }

}

这样的结果并不是我们期望看到的,如果期望达到预期的效果可以使用synchronized

publicclassSynchronizedTest2implements Runnable {

    Timer2 t = new Timer2();

    publicstaticvoid main(String[] args) {

        SynchronizedTest2 sync =new SynchronizedTest2();

        Thread t1 = newThread(sync);

        Thread t2 = newThread(sync);

        t1.setName("thread1");

        t2.setName("thread2");

        t1.start();

        t2.start();

    }

    publicvoidrun() {

        t.add(Thread.currentThread().getName());

    }

}

class Timer2 {

    privatestaticintcount = 0;

    publicsynchronizedvoid add(String threadName) {

//      synchronized(this) {

            count++;

            try {

                Thread.sleep(1000);

            } catch(InterruptedException e) {

                e.printStackTrace();

            }

            System.out.println(threadName+"你是第" +count +"调用该线程的!");

//      }

    }

}


原创粉丝点击