起航学习网

- 让每个人都能学到最前沿新知识、新技能!
起航学习网
当前位置: 起航学习网 > 短期培训 > 编程语言 > 2022年Java并发-多线程的学习指南

2022年Java并发-多线程的学习指南

时间:2022-06-08 14:16:48来源:IT培训网 作者:Java学习网 已有: 名学员访问该课程

  快捷搜索:Java并发学习

前言: Java并发(多线程)。本文介绍如何使用Java进行并发编程。它涵盖了并行编程、不变性、线程、执行器框架(线程池

Java并发(多线程)。本文介绍如何使用Java进行并发编程。它涵盖了并行编程、不变性、线程、执行器框架(线程池)、期货、可调用的CompletableFuture和fork-join框架的概念。

1.什么是并发?

并发是并行运行多个程序或程序的几个部分的能力。如果一项耗时的任务可以异步或并行执行,这将提高程序的吞吐量和交互性。

现代计算机在一个CPU中具有多个CPU或多个内核。利用这些多核的能力可能是成功的大容量应用程序的关键。

2.进程与线程

一个进程独立运行并与其他进程隔离。它不能直接访问其他进程中的共享数据。进程的资源,例如内存和CPU时间,是通过操作系统分配给它的。

线程是所谓的轻量级进程。它有自己的调用栈,但可以访问同一进程中其他线程的共享数据。每个线程都有自己的内存缓存。如果一个线程读取共享数据,它会将这些数据存储在自己的内存缓存中。

线程可以重新读取共享数据。

默认情况下,Java应用程序在一个进程中运行。在Java应用程序中,您使用多个线程来实现并行处理或异步行为。

3.并发收益的限制

在Java应用程序中,您使用多个线程来实现并行处理或异步行为。并发承诺更快地执行某些任务,因为这些任务可以分为子任务,并且这些子任务可以并行执行。当然,运行时间受到可以并行执行的任务部分的限制。

理论上可能的性能增益可以通过以下称为阿姆达尔定律的规则来计算。

如果F是程序不能并行运行的百分比,N是进程数,则最大性能增益为1/(F+((1-F)/N))。

4.并发问题

线程有自己的调用栈,但也可以访问共享数据。因此,您有两个基本问题,可见性和访问问题。

如果线程A读取后来由线程B更改的共享数据并且线程A不知道此更改,则会出现可见性问题。

如果多个线程同时访问和更改相同的共享数据,则可能会出现访问问题。

可见性和访问问题可能导致:

活跃度失败:由于数据并发访问中的问题,例如死锁,程序不再反应。

安全故障:程序创建了不正确的数据。

5.进程和线程

Java程序在自己的进程中运行,默认情况下在一个线程中运行。Java通过代码支持线程作为Java语言的一部分Thread。Java应用程序可以通过此类创建新线程。

Java 1.5还为包的并发提供了改进的支持java.util.concurrent。

6.锁和线程同步

Java提供了锁来保护代码的某些部分,以便同时由多个线程执行。锁定某个方法或Java类的最简单方法是使用synchronized关键字定义方法或类。

Java中的synchronized关键字确保:

只有一个线程可以同时执行一段代码

进入同步代码块的每个线程都会看到由同一锁保护的所有先前修改的效果

对于线程块的互斥访问和线程之间的可靠通信,同步是必需的。

您可以使用synchronized关键字来定义方法。这将确保只有一个线程可以同时进入该方法。另一个调用这个方法的线程会一直等到第一个线程离开这个方法。

public synchronized void critial() {
    // some thread critical stuff
    // here
}

您还可以使用synchronized关键字来保护方法中的代码块。该块由一个键保护,该键可以是字符串或对象。这把钥匙叫做锁。

所有受同一个锁保护的代码只能由一个线程同时执行。

例如下面的数据结构将确保只有一个线程可以访问add()andnext()方法的内部块。

package de.vogella.pagerank.crawler;

import java.util.ArrayList;
import java.util.List;

/**
 * Data structure for a web crawler. Keeps track of the visited sites and keeps
 * a list of sites which needs still to be crawled.
 *
 * @author Lars Vogel
 *
 */
public class CrawledSites {
    private List<String> crawledSites = new ArrayList<String>();
    private List<String> linkedSites = new ArrayList<String>();

    public void add(String site) {
        synchronized (this) {
            if (!crawledSites.contains(site)) {
                linkedSites.add(site);
            }
        }
    }

    /**
     * Get next site to crawl. Can return null (if nothing to crawl)
     */
    public String next() {
        if (linkedSites.size() == 0) {
            return null;
        }
        synchronized (this) {
            // Need to check again if size has changed
            if (linkedSites.size() > 0) {
                String s = linkedSites.get(0);
                linkedSites.remove(0);
                crawledSites.add(s);
                return s;
            }
            return null;
        }
    }

}

以上就是IT培训网小编介绍的"2022年Java并发-多线程的学习指南",希望对大家有帮助,如有疑问,请在线咨询,有专业老师随时为您服务。

Java学习

文章出自:http://qh.itpxw.cn/peixun/software/2022121578.html

文章标题:2022年Java并发-多线程的学习指南



免责声明:本站文章均由入驻起航学习网的会员所发或者网络转载,所述观点仅代表作者本人,不代表起航学习网立场。如有侵权或者其他问题,请联系举报,必删。侵权投诉

你也许会喜欢如下的文章?
(责任编辑:深圳学历教育网)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
培训学校
IT培训网 访问该机构站点 报名留言 加为好友 用户等级:注册会员 用户级别:10 机构名称:IT培训网 联 系 人:罗老师 联系电话:13783581536 联系手机:13783581536 在线客服:起航学习网客服 在 线 QQ:起航学习网客服 电子邮件: 网站域名:http://www.itpxw.cn 注册时间:2016-07-18 11:07 最后登录:2024-02-20 13:02
推荐内容