线程相关

1.原子性:

        操作是不可分割的,就说这个操作是原子操作。比如a++; 这个操作实际是a = a + 1;是可分割的,所以他不是一个原子操作。非原子操作都会存在线程安全问题,需要我们使用同步技术(sychronized)来让它变成一个原子操作。无论是直接的还是间接的,几乎 java.util.concurrent 包中的所有类都使用原子变量,而不使用同步。

java的concurrent包下提供了一些原子类,比如:AtomicInteger、AtomicLong、AtomicReference等。如果一段代码被认为是Atomic,则表示这段代码在执行过程中,是不能被中断的。

java.util.concurrent这个包里面提供了一组原子类。其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性,即当某个线程进入方法,执行其中的指令时,不会被其他线程打断,而别的线程就像自旋锁一样,一直等到该方法执行完成,才由JVM从等待队列中选择一个另一个线程进入,这只是一种逻辑上的理解。实际上是借助硬件的相关指令来实现的,不会阻塞线程(或者说只是在硬件级别上阻塞了)。

2.可见性:

是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的。也就是一个线程修改的结果,另一个线程马上就能看到。比如:用volatile修饰的变量,就会具有可见性。volatile修饰的变量volatile 会拒绝编译器对其修饰的变量进行优化,不允许线程内部缓存和重排序,即直接修改内存。所以对其他线程是可见的,但是这里需要注意一个问题,volatile只能让被他修饰内容具有可见性,不能保证它具有原子性。比如 volatile int a = 0;之后有一个操作 a++;这个变量a具有可见性,但是a++
依然是一个非原子操作,也就这这个操作同样存在线程安全问题。

在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。由于使用volatile屏蔽掉了VM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字。

时间: 2024-10-13 22:26:21

线程相关的相关文章

进程 & 线程相关知识

不管Java,C++都有进程.线程相关的内容.在这里统一整理吧. Python的线程,其实是伪线程,不能真正的并发.下面也有讲. 线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈). 多个线程共享内存. 参考了这篇文章:http://www.cnblogs.com/qiaoconglovelife/p/5319779.html 进程与PCB 进程:进程是程序的一次执行过程,是系统进行资源分配和调度的一个独立单位. 进程实体(进程映像):由程序段.相关数

java笔记--关于Object类与线程相关的方法

关于Object类中的线程方法 Object类是所有Java类的 父类,在该类中定义了三个与线程操作有关的方法,使得所有的Java类在创建之后就支持多线程 这三个方法是:notify(),notifyAll(),wait(),这几个方法都是用来控制线程的运行状态的. 方法列表如下: notify() : 唤醒在此对象监视器上等待的单个线程 notifyAll() : 唤醒在此对象监视器上等待的所有线程 wait() : 在其他线程时调用此对象的notify()或者notifyAll()方法前,导

线程相关的单例模式(C\C++)

最近开发有这样的需求, 我需要一个静态类,我可以在线程中的任何地方调用它的public函数已完成对应的功能: 这个静态类会调用我初始化给它的一个指针,这个指针是与线程一一对应的: 准确来说这种模式应该叫多例模式,它是单例模式和工厂模式的一个变式.下面说一下,我的实现思路. (一)实例指针 如果是单例模式,会有一个指针或者静态变量来存储这个静态变量,而这里多例,则需要使用一个Map来存储,Map的key是当前线程的句柄,Map定义如下: typedef map<DWORD, CRelatedThr

PyQt5学习笔记15----PyQt 线程相关类

QThread是我们将要详细介绍的第一个类.它也是 Qt 线程类中最核心的底层类.由于 PyQt 的跨平台特性,QThread要隐藏掉所有平台相关的代码. 正如前面所说,要使用QThread开始一个线程,我们可以创建它的一个子类,然后覆盖其QThread.run()函数: class Thread(QThread): def __init__(self): super(Thread,self).__init__() def run(self): pass #线程相关代码 然后我们这样新建一个新的

iOS开发Swift篇(02) NSThread线程相关简单说明

iOS开发Swift篇(02) NSThread线程相关简单说明 一 说明 1)关于多线程部分的理论知识和OC实现,在之前的博文中已经写明,所以这里不再说明. 2)该文仅仅简单讲解NSThread在swift语境中的一些使用和注意点,别他. 3)本文涉及代码可以从https://github.com/HanGangAndHanMeimei/Code地址获得. 二 NSThread的基本使用和创建 1)基本用法(主线程|当前线程) 1 //1.获得执行该方法的当前线程 2 let currentT

APUE: 线程相关库函数

线程有时称为轻权进程. 进程的所有信息对该进程的所有线程都是共享的. 每个线程有一个线程ID,线程ID只在它所属的进程环境中有效. 线程从进程继承的东西: 进程ID 地址空间 浮点环境 信号屏蔽字(不包括未决的信号集) 线程间共享的东西: 进程指令 大部分数据 信号处理程序和信号处理 当前工作目录 用户ID和组ID 线程间独立的东西: 线程ID 寄存器集合 栈 errno 信号掩码 优先级 所有线程函数返回类型为int的成功返回0,失败返回错误码,不设置errno. 线程编程需要链接库: -lp

Python之路(第四十二篇)线程相关的其他方法、join()、Thread类的start()和run()方法的区别、守护线程

一.线程相关的其他方法 Thread实例对象的方法 # isAlive(): 返回线程是否活动的. # getName(): 返回线程名. # setName(): 设置线程名. ? threading模块提供的一些方法: # threading.currentThread(): 返回当前的线程对象. # threading.enumerate(): 返回一个包含正在运行的线程的list.正在运行指线程启动后.结束前,不包括启动前和终止后的线程. # threading.activeCount(

测试必备之Java知识(四)———— 线程相关

线程相关 Java多线程实现方式 继承Thread,实现Runnable接口,实现Callable接口(能抛异常且有返回值,不常用) 为什么有了继承Thread方式还要有Runnable接口方式 实现接口的方式适合多个相同程序代码的线程去处理同一个资源,可以避免Java中单继承的限制 为什么JVM启动是多线程的? 因为至少启动了两个线程:主线程.垃圾回收线程 线程和进程的含义 进程:是操作系统资源分配的基本单位,正在运行的程序 线程:是任务调度和执行的基本单位,程序使用CPU的最基本单位 多线程

Qt 学习之路 :Qt 线程相关类

希望上一章有关事件循环的内容还没有把你绕晕.本章将重新回到有关线程的相关内容上面来.在前面的章节我们了解了有关QThread类的简单使用.不过,Qt 提供的有关线程的类可不那么简单,否则的话我们也没必要再三强调使用线程一定要万分小心,一不留神就会陷入陷阱. 事实上,Qt 对线程的支持可以追溯到2000年9月22日发布的 Qt 2.2.在这个版本中,Qt 引入了QThread.不过,当时对线程的支持并不是默认开启的.Qt 4.0 开始,线程成为所有平台的默认开启选项(这意味着如果不需要线程,你可以