Java并发编程 - 线程安全性之原子性(三)(下)

简介: Java并发编程 - 线程安全性之原子性(三)(下)

案例三


package com.mmall.concurrency.example.sync;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@Slf4j
public class SynchronizedExample2 {
    // 修饰一个类
    public static void test1(int j) {
        synchronized (SynchronizedExample2.class) {
            for (int i = 0; i < 10; i++) {
                log.info("test1 {} - {}", j, i);
            }
        }
    }
    // 修饰一个静态方法
    public static synchronized void test2(int j) {
        for (int i = 0; i < 10; i++) {
            log.info("test2 {} - {}", j, i);
        }
    }
    public static void main(String[] args) {
        SynchronizedExample2 example1 = new SynchronizedExample2();
        SynchronizedExample2 example2 = new SynchronizedExample2();
        ExecutorService executorService = Executors.newCachedThreadPool();
        executorService.execute(() -> {
            example1.test1(1);
        });
        executorService.execute(() -> {
            example2.test1(2);
        });
    }
}

image.png


案例四


package com.mmall.concurrency.example.sync;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@Slf4j
public class SynchronizedExample2 {
    // 修饰一个类
    public static void test1(int j) {
        synchronized (SynchronizedExample2.class) {
            for (int i = 0; i < 10; i++) {
                log.info("test1 {} - {}", j, i);
            }
        }
    }
    // 修饰一个静态方法
    public static synchronized void test2(int j) {
        for (int i = 0; i < 10; i++) {
            log.info("test2 {} - {}", j, i);
        }
    }
    public static void main(String[] args) {
        SynchronizedExample2 example1 = new SynchronizedExample2();
        SynchronizedExample2 example2 = new SynchronizedExample2();
        ExecutorService executorService = Executors.newCachedThreadPool();
        executorService.execute(() -> {
            example1.test1(1);
        });
        executorService.execute(() -> {
            example2.test2(2);
        });
    }
}

image.png


案例3 & 案例4 分析


锁的是方法,而不是对象。什么意思呢?也就是说不同对象调用同一个被锁的方法之间执行按顺序来,所以为什么说其实是锁所有的对象,这个说法是有歧义的,应该还是说是锁所有调用该方法的对象。

那么问题来了,不同的对象调用不同的静态sychronized方法也是按先后顺序来?!虽然我测试的结果是支持按顺序来的,不过不知读者有何见解?

目前测试出的结论:在案例3和案例4的基础上,不同对象调用不同sync静态方法,把它看成是一个单元的话,单元之间的执行顺序是不一定的,但是好像执行了很多次又一直是一个规律,个人目测应该是线程池里面的影响。当然内部是不会交错的噢~


image.png


对比

  • synchronized 适合竞争不激烈时使用,可读性好,竞争激烈时性能下降很快。
  • lock 适合竞争激烈时使用,能维持常态。
  • atomic 竞争激烈时也能维持常态,性能比lock好,但是只能同步一个值。
目录
相关文章
|
Java
Java并发编程 - 线程安全性之有序性
Java并发编程 - 线程安全性之有序性
208 0
Java并发编程 - 线程安全性之有序性
|
Java
Java并发编程 - 线程安全性之原子性(三)(上)
Java并发编程 - 线程安全性之原子性(三)(上)
177 0
Java并发编程 - 线程安全性之原子性(三)(上)
|
Java 索引
Java并发编程 - 线程安全性之原子性(二)
Java并发编程 - 线程安全性之原子性(二)
209 0
Java并发编程 - 线程安全性之原子性(二)
|
算法 Java
Java并发编程 - 线程安全性之原子性(一)
Java并发编程 - 线程安全性之原子性(一)
202 0
Java并发编程 - 线程安全性之原子性(一)
|
安全 Java
Java并发编程 - 线程安全性之简介
Java并发编程 - 线程安全性之简介
159 0
Java并发编程 - 线程安全性之简介
|
安全 Java 编译器
Java中枚举的线程安全性及序列化问题
--枚举是如何保证线程安全的 要想看源码,首先得有一个类吧,那么枚举类型到底是什么类呢?是enum吗?答案很明显不是,enum就和class一样,只是一个关键字,他并不是一个类,那么枚举是由什么类维护的呢,我们简单的...
1882 0
|
5月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
274 1
|
5月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
294 1
|
6月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
255 0