当前位置: 首页 > 编程日记 > 正文

java多线程编程01---------基本概念

一. java多线程编程基本概念--------基本概念

  java多线程可以说是java基础中相对较难的部分,尤其是对于小白,次一系列文章的将会对多线程编程及其原理进行介绍,希望对正在多线程中碰壁的小伙伴有所帮助。

  (一)进程、线程和任务

  进程可以认为是程序执行的一个实例,是程序向操作系统申请资源的基本单位,每个进程都拥有自己独立的地址空间。

  线程是操作系统能够进行运算调度的最小单元,它被包含在进程之中,一个进程可以有多个线程。同一个进程中的多个线程共享这个进程的资源。

  每个线程完成的计算被称为任务。

   (二)串行、并发和并行

  串行:按照顺序完成多个任务。

  并发:在一段时间内以交替的方式完成多个任务。

  并行:以齐头并进的方式完成多个任务。

  并发往往是带着部分串行的并发,并发的极致就是串行。一个处理器就可以实现并发,但并行需要多个处理器在同一个时刻各自运行一个线程来实现。

  多线程编程的实质就是将任务的处理方式由串行改为并发。

  (三)多线程编程的优缺点

  • 优点

  提高系统的吞吐率;调高响应性;充分利用多核处理器;最小化对资源的使用(相对于多进程)

  • 缺点

  可能会造成线程安全问题、线程活性问题、引起上下文切换

  (四)竟态

  竟态是指一个计算结果的正确性和时间有关的现象。竟态往往伴随着读脏数据问题(线程读到的是一个过时的数据)、丢失更新(一个线程对数据所做的更新没有体现到后续其他线程对该数据的读取上)。

  竟态通常是在多个线程在没有采取任何控制措施的情况下并发更新、读取同一个共享变量。竟态的两种模式为:read-modify-write(读-改-写)和check-then-act(检测而后行动)。

  (五)线程安全问题

   线程安全问题概括起来变现为3个方面:原子性、可见性和有序性。

  1. 原子性

  原子性是指访问某个共享变量的操作从执行线程以外的其他线程来看,该线程要么执行结束,要么尚未发生,即其他线程不会看到该操作的中间结果。java语言中,任何数据类型的读操作都具有原子性,除了long和double类型的基本数据类型和引用数据类型的写操作都具有原子性。

  Java中有两种方式实现原子性:使用锁、CAS

  2. 可见性

  可见性用于描述一个行程对共享变量的更新对于另外一个线程而言是否可见的问题。可见性的保障是通过使更新共享变量的处理器执行冲刷处理器缓存,使读取共享变量的处理器执行刷新处理器缓存。

  父线程在启动子线程之前对共享变量的更新对于子线程来说是可见的,之后对于共享变量的更新对于子线称来说没有保障的。

  3. 有序性 

  有序性用来描述一个线程的内存访问操作在另外一个线程看来是否有序的问题。

  重排序可以分为一下三种:

  1)编译器优化的重排序。编译器在保证貌似串行语义的情况下,可以重新安排语句的执行顺序。

  2)指令级并行重排序:如果不存在数据依赖性,处理器可以语句对应机器指令的执行顺序。

  3)内存系统重排序。由于处理器使用缓存和读写缓冲区,使得加载和存储操作看上去是乱序的。

  (六)java内存模型和happens-before

  Java内存模型使用happens-before关系来保证可见性和有序性。

  1. java内存模型

  java内存模型(即Java Memory Model,简称JMM)本身是一种抽象的概念,并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。由于JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存(有些地方称为栈空间),用于存储线程私有的数据,而Java内存模型中规定所有变量都存储在主内存,主内存是共享内存区域,所有线程都可以访问,但线程对变量的操作(读取赋值等)必须在工作内存中进行,首先要将变量从主内存拷贝的自己的工作内存空间,然后对变量进行操作,操作完成后再将变量写回主内存,不能直接操作主内存中的变量,工作内存中存储着主内存中的变量副本拷贝,前面说过,工作内存是每个线程的私有数据区域,因此不同的线程间无法访问对方的工作内存,线程间的通信(传值)必须通过主内存来完成,其简要访问过程如下图

  

2. happens-before

  happens-before有两层含义:

  1)如果一个操作happens-before另一个操作,那么第一个操作的执行结果将对第二个操作可见,第一个操作的执行顺序排在第二个操作之前。(这条是JMM对程序员的承诺)

  2)两个操作之间存在happens-before关系,并不意味着java平台的具体实现必须要按照happens-before关系指定的顺序来执行,只要保证重排序之后的结果与按happens-before关系一致即可(这条JMM对编译器和处理器重排序的约束)。

  貌似串行语义(as-if-serial)保证单线程内程序执行结果不改变,happens-before关系保证正确同步的多线程程序执行结果不改变。

  具体规则:

  • 程序顺序规则:同一个线程中的每个操作happens-before该线程中的任意后续操作。
  • 内部锁规则:内部锁的释放happens-before后续每一个对该锁的申请
  • volatile规则:对于一个volatile域的写happens-before后续每一个针对该变量的读操作
  • 传递性:如果A happens-before B,B happens-before C,那么A happens-before C
  • start()规则:如果线程执行操作B.start(),那么A线程中的B.start()操作happens-before B线程中的任意操作
  • join()规则:如果A线程执行B.start()操作并成功返回,那么b线程中的任意操作happens-before A线程执行完B.start()返回后的任意操作。
  • 程序中断规则:对线程iterrupted()的调用先行于被中断线程检测到中断事件的发生。
  • 对象finalize规则:一个对象的初始化完成先行于它的finalize()方法的开始。

  (七) 阻塞与非阻塞

  阻塞和非阻塞用来形同多线程间的相互影响,一个线程占用了临界区资源,其他线程需要这个资源进行等待该资源的释放,会导致等待线程的挂起,这种情况就是阻塞,而非阻塞恰好相反,他强调没有一个线程可以阻塞其他线程,所有线程都会尝试着往前运行。

转载于:https://www.cnblogs.com/gdy1993/p/9117331.html

相关文章:

Linux下查看Nginx,tomcat等的并发连接数和连接状态

1、查看Web服务器(Nginx Apache)的并发请求数及其TCP连接状态: netstat -n | awk /^tcp/ {S[$NF]} END {for(a in S) print a, S[a]}或者: netstat -n | awk /^tcp/ {state[$NF]} END {for(key in state) print key,"t"…

Java笔记整理-02.Java基础语法

1,标识符 由英文字母、数字、_(下划线)和$组成,长度不限。其中英文字母包含大写字母(A~Z)和小写字母(a~z),数字包含0到9。 标识符的第一个字符不能是数字(即…

android中The connection to adb is down,问题和解决 AndroidEclipseAntXML

1.报错:BUILD FAILEDD:\workspace\ganji\build.xml:144: The following error occurred while executing this line:D:\workspace\ganji\build.xml:271: Unable to delete file D:\workspace\ganji\tmp\proguard\tmp.jar解决:已经开了一个模拟器了&#…

建立可扩展的silverlight应用框架 step-4

通过外部配置文件加载模块module 在上一节中为项目引入了“Prism”框架,并建立了一个Hello Prism做测试。这里要把项 目好好的整理一下。使其更加的合理和具有可扩展性。 我的目的是,在左侧的导航栏目里点击按钮,相应的右侧的主体部分显示不同…

ntp时间同步服务

前言 NTP 网络时间协议用来同步网络上不同主机的系统时间。你管理的所有主机都可以和一个指定的被称为 NTP 服务器的时间服务器同步它们的时间。而另一方面,一个 NTP 服务器会将它的时间和任意公共 NTP 服务器,或者你选定的服务器同步。由 NTP 管理的所有…

C# GDI+ 简单绘图 (三)

感谢大家的支持,这几天从早忙到晚,一个字累呀!!!现在挺困的,但是又不习惯这么早睡觉,哎~~还是利用这个时间继续来写第三篇吧.前两篇已经基本向大家介绍了绘图的基本知识.那么,我就用我们上两篇所学的,做几个例子.我们先来做一个简单的----仿QQ截图,关于这个的例子其…

用java实现一个简易自动提款机

用java实现一个简易自动提款机,且有以下要求 如何实现呢?首先,我们定义一个用户类User,同时根据要求设计好属性(本人部分命名没有使用驼峰命名法,不够规范)。因为一个人可能有多个卡,卡号又不能重复&#x…

mysql java jdbc 如何 update select

2019年8月6日17:28:07 sql 不知道怎么写,也没去查,因为需求可能中途需要修改值,有点麻烦 直接用jdbc实现。 查询出来的值,直接根据update条件更新,写在一个方法里 public static void GetWeiLiaoMsg(String day) {try …

2000DC和DNS迁移到2003 R2

2000DC和DNS迁移到2003 R2 实验环境:一台TPLINK路由器,三台电脑,以下简称A,B,C。A当作公司的2000DC和DNS服务器。B当作公司要升级的2003R2 DC。C 当作客户机,测试用。1. 对TPLINK路由器&…

SAP EWM 代码实现Transportation Unit(TU)的创建

在EWM中很少有创建或者修改业务对象的BAPI存在,更多的是通过很多面向对象的类方法来实现。 以下这个简单的创建TU应该能很好的体现SCM平台中的OO特性。 REPORT yewm_tu_creation NO STANDARD PAGE HEADING. TYPES: BEGIN OF lty_key_wrk, tu_num TY…

libcurl 客户端实例

参考库 libftp (though its in C)ftplib (again, looks like C)libCurl seems to have FTP capabilities.ace源码&#xff1a;main.c #include <stdio.h> #include <string.h>#include <curl/curl.h> #include <sys/types.h> #include <sys/stat.h&…

哈夫曼树的生成及哈夫曼编码

首先构造哈夫曼树结构体&#xff0c;初始化哈夫曼树的四个无符号整型域&#xff0c;输入文本&#xff0c;统计各个字符的权值&#xff0c;然后构建哈夫曼树&#xff0c;从根到叶子逆向求哈夫曼树的编码。 #include"stdio.h" #include"string.h" #include&…

shiro(2)-架构与配置

认证就是用户确认身份的过程&#xff0c;确认登录的用户身份能够操作的内容。 使用shiro认证分为以下几个步骤&#xff1a; 1&#xff0c;得到主体的认证和凭据。 // lets login the current user so we can check against roles and permissions:if (!currentUser.isAuthentic…

unity中的UI状态机,用于各界面之间的切换和跳转

首先感谢姜雪松先生&#xff0c;大家可以去他的博客查看注释以及代码等&#xff0c;http://jxwgame.blog.51cto.com/943299/1613585 言归正传&#xff1a; 1.在开发项目的过程中&#xff0c;总是会遇到这样的问题&#xff0c;从一个界面跳转到另外一个界面&#xff0c;每次操作…

【转载】Session服务器配置指南与使用经验

作者&#xff1a;张子秋出处&#xff1a;http://www.cnblogs.com/zhangziqiu/ 原文链接&#xff1a;http://www.cnblogs.com/zhangziqiu/archive/2009/03/26/sessionserver.htm一、摘要所有Web程序都会使用Session保存数据. 使用独立的Session服务器可以解决负载均衡场景中的Se…

如何使用jdbc连接数据库

如何使用jdbc连接数据库 数据库是一个有组织的数据集合。数据库管理系统以一种与数据库格式一致的方式&#xff0c;提供了存储和组织数据的机制。数据库管理系统允许在不考虑内部数据表示的情况下访问和存储数据。 java程序使用JDBC API与数据库通信&#xff0c;并用它操纵数…

Mysql配置查询

查看mysql数据库的线程数&#xff1a; show global status like Thread%; 如果我们在MySQL服务器配置文件中设置了thread_cache_size&#xff0c;当客户端断开之后&#xff0c;服务器处理此客户的线程将会缓存起来以响应下一个客户而不是销毁(前提是缓存数未达上限)。Threads_c…

自我暗示的三大规律

伟人之所以伟大&#xff0c;是因为别人放弃时&#xff0c;他却在坚持。理解暗示的三大规律后&#xff0c;你就会清楚地知道&#xff0c;为什么在别人放弃的时候&#xff0c;你仍然要坚持。 自我暗示第一规律&#xff1a;重复 经常重复一种思想会产生信念&#xff0c;进而变得坚…

python爬虫入门urllib库的使用

urllib库的使用&#xff0c;非常简单。 import urllib2response urllib2.urlopen("http://www.baidu.com") print response.read() 只要几句代码就可以把一个网站的源代码下载下来。 官方文档&#xff1a;https://docs.python.org/2/library/urllib2.html urllib2.u…

maven如何在eclipse上加载

maven如何在eclipse上安装和使用 maven是Apache旗下的定级开源工具,在项目管理方面有强大的能力。Maven 除了以程序构建能力为特色之外&#xff0c;还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性&#xff0c;所以常常用两三行 Maven 构建脚本就可以构建…

初步判断内存泄漏方法

有时候&#xff0c;内存泄漏不明显&#xff0c;或者怀疑系统有内存泄漏&#xff0c;我们可以通过下面介绍的方法初步确认系统是否存在内存泄漏。首先在Java命令行中增加-verbose:gc参数&#xff0c;然后重新启动java进程。当系统运行过程中,JVM进行垃圾回收的时候&#xff0c;会…

com组件和一般dll的区别

这阵子在想一个需要利用com组件的小程序怎么做&#xff0c;突然想起上次去面试的时候考官问过autocad开发时为什么要利用com&#xff0c;而不采用一般的dll呢&#xff1f; 到google上查了一下&#xff0c;许多人也问了一样的问题&#xff1a;&#xff09; 用com来写程序…

WinCE6.0 修改开机Logo方法集锦(二)

中秋假期已过&#xff0c;回来继续该博文主题。今天讲解第二种方法&#xff0c;将Logo图片的数据写入到Nand Flash中&#xff0c;在启动初始化LCD的时候&#xff0c;从固定的地址将数据读出并填充到显示缓存中。<?xml:namespace prefix o ns "urn:schemas-microsoft…

[动态dp]线段树维护转移矩阵

背景&#xff1a;czy上课讲了新知识&#xff0c;从未见到过&#xff0c;总结一下。 所谓动态dp&#xff0c;是在动态规划的基础上&#xff0c;需要维护一些修改操作的算法。 这类题目分为如下三个步骤&#xff1a;&#xff08;都是对于常系数齐次递推问题&#xff09; 1先不考虑…

原始ajax方式调用asp.net后台方法

aspx页面&#xff1a; <% Page Language"C#" AutoEventWireup"true" CodeFile"Data.aspx.cs" Inherits"Data" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xht…

洛谷P4480 【[BJWC2018]餐巾计划问题】

这道题和网络流 \(24\) 题中的餐巾计划的确不一样, \([\) \(BJWC\) \(2018\) \(]\) 餐巾计划问题的数据范围更大。 一个餐厅在相继的 \(n\) 天里&#xff0c;每天需用的餐巾数不尽相同。假设第 \(i\) 天 \((\) \(i\) \(\) \(1\) \(,\) \(2\) \(,\) \(...\) \(,\) \(n\) \()\)需…

灵活使用java反射简化servlet

在我们初学jsp的时候&#xff0c;我们通常将java代码放到jsp页面

第四篇 Gallery控件

直奔主题~&#xff01; 结构如图&#xff1a; main.xml代码: <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:orientation"vertical" android:la…

macaca之app-inspector

简单介绍 之前已经将macaca的环境搭建好了&#xff0c;现在就需要进行元素的定位&#xff0c;这里使用app-inspector&#xff0c;然后进行自动化脚本的编写。 实际操作 一、安装app-inspector npm i app-inspector -g 安装成功确保如下命令中有手机或模拟器的连接&#xff0c;可…

visual-reasoning 笔记

目录 整理最近学习 visual-reasoning的笔记 1. 关注 ACL、EMNLP、NAACLI等会议文章 未开始 2. Cyc项目 2.1 cyc知识库介绍&#xff1a; ​ 该知识库包含了320w条人类断言&#xff0c;30w概念&#xff0c;15000谓词。 ​ Cyc知识库中表示的知识一般形如“每棵树都是植物”、“植…