一分钟认识synchronized

Posted Panda_Java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一分钟认识synchronized相关的知识,希望对你有一定的参考价值。

1. 多线程的创建方式之一

通过实现Runnable接口,并重写run方法实现多线程, 下面调用10个线程,每次运行的结果都不一样。

public class synchronized_test implements Runnable {
    private static int count = 0;

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            Thread thread = new Thread(new synchronized_test());
            thread.start();
        }
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("result: " + count);
    }

    @Override
    public void run() {
        for (int i = 0; i < 1000000; i++)
            count++;
    }
}

// 每次运行结果不一样

注:在java关键字synchronized就具有使每个线程依次排队操作共享变量的功能。很显然,这种同步机制效率很低,但synchronized是其他并发容器实现的基础,对它的理解也会大大提升对并发编程的感觉。

2. synchronized实现原理

在java代码中使用synchronized可是使用在代码块和方法中,根据Synchronized用的位置可以有这些使用场景

如图,synchronized可以用在方法上也可以使用在代码块中,其中方法是实例方法和静态方法分别锁的是该类的实例对象和该类的对象。而使用在代码块中也可以分为三种,具体的可以看上面的表格。这里的需要注意的是:如果锁的是类对象的话,尽管new多个实例对象,但他们仍然是属于同一个类依然会被锁住,即线程之间保证同步关系

3. 使用synchronized

//public class synchronized_test {
//}
public class synchronized_test implements Runnable {
    private static int count = 0;

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            Thread thread = new Thread(new synchronized_test());
            thread.start();
        }
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("result: " + count);
    }

    @Override
    public void run() {
        synchronized (synchronized_test.class) {
            for (int i = 0; i < 1000000; i++)
                count++;
        }
    }
}
// 运行结果为1000000

以上是关于一分钟认识synchronized的主要内容,如果未能解决你的问题,请参考以下文章

synchronized学习

原子性内存可见性和重排序——重新认识synchronized和volatile

多线程 Thread 线程同步 synchronized

从头认识java-18.6 synchronized在其他对象上同步和ThreadLocal来消除共享对象的同步问题

一分钟认识:Cucumber框架(一)

加不加 synchronized 有什么区别?