Java 线程安全 synchronized(3)

这段代码的运行结果是错误的,请看main函数的实现方式,使用Runnable创建两个线程,但是两个线程拥有各自的Runnable实例,所以当thread1线程进入同步方法时加的是自己的对象实例锁,而thread2在进入同步方法时关注的是自己的实例锁,两个线程拥有不同的对象实例锁,因此无法达到互斥的要求。


略作改动:

package com.linuxidc.base.threadTest;

public class SynchronizedTest implements Runnable{
    private static int m=0;
    public static void main(String[] args) {
        Thread thread1=new Thread(new SynchronizedTest());
        Thread thread2=new Thread(new SynchronizedTest());
        thread1.start();
        thread2.start();
        try {
            //join() 使main线程等待这连个线程执行结束后继续执行下面的代码
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("m的最终结果:"+m);
    }
    public void run() {
        for(int i=0;i<10000;i++){
            count();
        }
    }
    public static synchronized void count(){
        m++;
    }
}

  这样处理结果就是我么想要的了,在这里我们将处理业务的代码封装成一个静态的同步方法,那现在访问该同步方法需要的是当前类的锁,而类在内存中只有一份,所以无论如何,他们使用的都是同一个锁。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/278d023a07ad7af4156020006e3c55ea.html