首页 > 编程语言 >深入理解Java中的并发编程

深入理解Java中的并发编程

时间:2024-07-10 09:33:25浏览次数:16  
标签:Java Thread concurrent 编程 并发 线程 println public

深入理解Java中的并发编程

大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!

并发编程是Java开发中的一个重要领域,通过并发编程,可以提高程序的执行效率和资源利用率。本文将深入探讨Java中的并发编程,包括线程的创建、同步机制、并发集合、线程池和并发工具类等内容。

1. 线程的创建

Java提供了多种创建线程的方式,常见的有继承Thread类和实现Runnable接口。

继承Thread类

package cn.juwatech.concurrent;

public class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("MyThread is running.");
    }

    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();
    }
}

实现Runnable接口

package cn.juwatech.concurrent;

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("MyRunnable is running.");
    }

    public static void main(String[] args) {
        Thread thread = new Thread(new MyRunnable());
        thread.start();
    }
}

2. 同步机制

在多线程环境下,多个线程可能会同时访问共享资源,导致数据不一致的问题。Java提供了多种同步机制来解决这些问题。

同步方法

package cn.juwatech.concurrent;

public class SynchronizedExample {
    public synchronized void syncMethod() {
        System.out.println("Synchronized method");
    }
}

同步块

package cn.juwatech.concurrent;

public class SynchronizedBlockExample {
    private final Object lock = new Object();

    public void syncBlock() {
        synchronized (lock) {
            System.out.println("Synchronized block");
        }
    }
}

3. 并发集合

Java的java.util.concurrent包提供了多种并发集合类,这些集合类在高并发环境下能够保证线程安全。

ConcurrentHashMap

package cn.juwatech.concurrent;

import java.util.concurrent.ConcurrentHashMap;

public class ConcurrentHashMapExample {
    public static void main(String[] args) {
        ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>();
        map.put("key", "value");
        System.out.println(map.get("key"));
    }
}

CopyOnWriteArrayList

package cn.juwatech.concurrent;

import java.util.concurrent.CopyOnWriteArrayList;

public class CopyOnWriteArrayListExample {
    public static void main(String[] args) {
        CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
        list.add("element");
        System.out.println(list.get(0));
    }
}

4. 线程池

线程池能够有效地管理和复用线程,避免频繁创建和销毁线程带来的开销。Java通过ExecutorService接口提供了多种线程池实现。

创建固定大小的线程池

package cn.juwatech.concurrent;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class FixedThreadPoolExample {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(2);

        for (int i = 0; i < 5; i++) {
            executorService.submit(() -> {
                System.out.println(Thread.currentThread().getName() + " is running");
            });
        }

        executorService.shutdown();
    }
}

创建缓存线程池

package cn.juwatech.concurrent;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CachedThreadPoolExample {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newCachedThreadPool();

        for (int i = 0; i < 5; i++) {
            executorService.submit(() -> {
                System.out.println(Thread.currentThread().getName() + " is running");
            });
        }

        executorService.shutdown();
    }
}

5. 并发工具类

Java提供了多种并发工具类来简化并发编程中的一些常见问题。

CountDownLatch

package cn.juwatech.concurrent;

import java.util.concurrent.CountDownLatch;

public class CountDownLatchExample {
    public static void main(String[] args) throws InterruptedException {
        int count = 3;
        CountDownLatch latch = new CountDownLatch(count);

        for (int i = 0; i < count; i++) {
            new Thread(() -> {
                System.out.println(Thread.currentThread().getName() + " is running");
                latch.countDown();
            }).start();
        }

        latch.await();
        System.out.println("All threads have finished.");
    }
}

CyclicBarrier

package cn.juwatech.concurrent;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierExample {
    public static void main(String[] args) {
        int count = 3;
        CyclicBarrier barrier = new CyclicBarrier(count, () -> {
            System.out.println("All threads have reached the barrier.");
        });

        for (int i = 0; i < count; i++) {
            new Thread(() -> {
                System.out.println(Thread.currentThread().getName() + " is running");
                try {
                    barrier.await();
                } catch (InterruptedException | BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }
}

Semaphore

package cn.juwatech.concurrent;

import java.util.concurrent.Semaphore;

public class SemaphoreExample {
    public static void main(String[] args) {
        int permits = 2;
        Semaphore semaphore = new Semaphore(permits);

        for (int i = 0; i < 5; i++) {
            new Thread(() -> {
                try {
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName() + " acquired a permit");
                    Thread.sleep(2000);
                    semaphore.release();
                    System.out.println(Thread.currentThread().getName() + " released a permit");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }
}

总结

通过本文,我们深入了解了Java中的并发编程。从线程的创建、同步机制、并发集合到线程池和并发工具类,我们逐步掌握了并发编程中的核心技术和实践方法。并发编程虽然复杂,但通过合理的设计和工具类的使用,可以大大简化并发编程的难度,提高程序的效率和稳定性。

微赚淘客系统3.0小编出品,必属精品,转载请注明出处!

标签:Java,Thread,concurrent,编程,并发,线程,println,public
From: https://www.cnblogs.com/szk123456/p/18293185

相关文章

  • Java中的垃圾回收机制详解
    Java中的垃圾回收机制详解大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!Java中的垃圾回收(GarbageCollection,GC)机制是Java虚拟机(JVM)管理内存的一项重要功能。GC机制通过自动回收不再使用的对象所占用的内存,防止内存泄漏,提升应用程序的性能和稳定性。......
  • 使用JUnit进行Java单元测试
    使用JUnit进行Java单元测试大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!单元测试是软件开发过程中至关重要的一部分,能够确保代码的正确性、健壮性和可维护性。JUnit是一个流行的Java单元测试框架,广泛应用于Java应用程序的测试。本文将详细介绍如......
  • 如何在Java中处理JSON数据
    如何在Java中处理JSON数据大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式之一。Java提供了多种库来处理JSON数据,最常用的包括Gson、Jackson和org.json等。在本文中,我们将详细介......
  • 【转】-Java CAS 原理剖析
    JavaCAS原理剖析本文转载来自​卡巴拉的树​的​JavaCAS原理剖析在Java并发中,我们最初接触的应该就是synchronized关键字了,但是synchronized属于重量级锁,很多时候会引起性能问题,volatile也是个不错的选择,但是volatile不能保证原子性,只能在某些场合下使用。像synchronized这......
  • 计算机毕业设计项目:18655 课程题库管理系统(开题答辩+程序定制+全套文案 )上万套实战教
    摘 要随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于课程题库管理系统当然也不能排除在外,随着网络技术的不断成熟,带动了课程题库管理系统,它彻底改变了过去传统的管理方式,不仅使服务管理难度变低了,还提升了管理的灵活性。这种个......
  • 计算机毕业设计项目: node.js 网上购物商城的设计与实现99525(开题答辩+程序定制+全套文
    摘 要随着社会的发展,计算机的优势和普及使得网上购物商城的开发成为必需。网上购物商城主要是借助计算机,通过对首页、站点管理(轮播图、公告栏)用户管理(管理员、注册用户)内容管理(商城资讯、资讯分类)商城管理(商城中心、分类列表、订单列表)等信息进行管理。减少管理员的工作......
  • 计算机毕业设计项目:校园新闻数据化系统的设计与实现 99293(开题答辩+程序定制+全套文案
    目 录摘要1绪论1.1研究目的和意义1.2选题背景和意义1.3系统开发技术的特色1.4springboot框架介绍1.5论文结构与章节安排22校园新闻数据化系统系统分析2.1可行性分析2.2系统流程分析2.2.1数据增加流程2.3.2数据修改流程2.3.3数据删除流程2.3......
  • 精讲:java之多维数组的使用
    一、多维数组简介1.为什么需要二维数组我们看下面这个例子?“        某公司2022年全年各个月份的销售额进行登记。按月份存储,可以使用一维数组。如果改写为按季度为单位存储怎么办呢?        或许现在学习了一维数组的你只能申请四个一维数组去存储每个季......
  • 关于力扣150题目——逆波兰表达式求值Java实现的三种解法
    题目介绍逆波兰表达式是一种后缀表达式,其运算符位于操作数之后。力扣150题目要求我们实现一个函数,计算给定逆波兰表达式的值。本文将介绍三种不同的Java实现方法来解决这个问题。解法一:使用栈这是最直观和常见的解法,使用栈来存储操作数,并在遇到运算符时从栈中弹出操作数......
  • 如何在Java中实现异步任务调度?
    如何在Java中实现异步任务调度?大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在现代Java应用中,异步任务调度是提升系统性能和响应速度的重要手段。通过异步任务调度,我们可以将一些耗时的任务放在后台处理,从而不阻塞主线程的执行。本文将详细介绍如何在Ja......