线程基础第1篇 synchronized

1.  前言

    在公司,其实很多 JAVA 程序员,他们可能知道多线程中有 synchronized 、volatile 、ReentrantLock、concurrent 下数据包等等。。这些看似高深的代名词,但是不等于他们就会懂得如何去使用,滥用的结果往往都是需要自己承担的,本篇文章主要讲诉synchronized 关键字的使用;

2. 线程安全的概念

  也许大家看过很多有关线程安全的书籍,这些书籍对线程安全的概念解释的很笼统,其实线程安全用一句话解释就是:当多个线程访问同一个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法)就是线程安全的;

3. 代码如下:

此代码在一个线程中定义了一个私有的属性 rount ,并给它赋值 5 ;然后在线程的 run() 方法中将它减减操作,然后输出线程的名字以及 rount 的值。在 mian 方法中定义了 5 个线程,分别去访问这个 run()方法;

我们的想法是让这个类输出:

但是实际上代码执行后,输出的却是:

因此,我们称此线程不是线程安全的,所以就需要用到 synchronized 关键字,synchronized: 可以在任意对象或方法上加锁,而加锁的这段代码称为 ”互斥区“ 或 ”临界区“;

加锁后代码如下:

输出结果:

4. 案例总结

    当多个线程访问 Thread01 的 run 方法时,以排队的方式进行处理(这里的排队是按照 CPU 分配的先后顺序而定的),一个线程想要执行 synchronized 修饰的方法里的代码,首先是尝试获得锁,如果拿到锁,执行 synchronized 代码体内容;拿不到锁,这个线程就会不断尝试去获得这把锁,直到拿到为止,而且是多个线程同时去竞争这把锁(会产生锁竞争的问题,下次讲解。)。

猜你喜欢

转载自www.cnblogs.com/luotao-bk/p/9187663.html