线程安全的安全程度
就线程安全性进行讨论的时候存在这样一个问题:线程的安全性是存在多种级别的,每个人谈论的级别其实并不相同,仅仅说某段代码不具备线程安全性并不能说明全部问题。然而许多人对线程的安全性有一些想当然的预期,有些时候这些预期是合理而合法的,但有些时候不是。下面给出一些此类的预期:通常认为多个线程读某对象时不会产生问题,问题只会在更新对象的时候出现,因为只有那时对象才会被修改, 从而有进入不稳定状态的危险。然而,某些对象具有内部状态,即使在读的时候内部状态也会被改变(比如某些对象有内部缓冲)。假如两个线程去读取这种对象,问题仍然会产生,除非该对象的读操作设计已经采用了合适的多线程处理方法。 通常认为更新两个相互独立的对象时,即使它们的类型相同也不会有问题。一般假设相互独立的对象之间是互不相关的,一个对象的不稳定状态并不会对另一个对象产生影响。然而,一些对象在内部是存在数据共享的(如静态的类数据,全局数据等),这使它们即使看上去没有什么逻辑上的关系,内部却依然存在联系。这种情况下,修改两个“相互独立”的对象怎么都会产生问题。考虑下面的情况:void f( ) { std::string x; // Modify x. }void g( ) { std::string y; // Modify y. }如果一个线程运行函数f()修改x,另一个线程运行函数g()修改y,这种情况下会出现问题吗?大部分人认为这是两个明显独立的对象,可以被同时改动而不会导致任何问题。但是,有一种可能性就是,两个对象内部存在共享数据,这完全依赖于std::string的实现,如果那样的话,同时改动便是有问题的了。实际上,如果两个对象内部存在共享数据的话,即使一个函数仅仅是读取对象,问题依然存在,因为改动另一个对象的函数可能触及内部的共享数据。通常认为即便使用一个通用的资源池,获取资源的函数也不存在线程安全性的问题。例如:void f() { char *p = new char[512]; // use the array p }void g() { char *p = new char[512]; // use the array p }如果一个线程执行函数f(),另一个线程执行函数g(),两个线程可能同时使用操作符new去分配内存。在多线程环境中,只有假设new操作符的实现已经考虑到这种情况,从同一个内存池中获取内存也设计了正确的处理方法,才可以认为安全性得到保证。实际中,new操作符在内部确实会同步这些线程,因而每次调用都能够得到独立的内存分配而不损坏共享的内存池。与此类似的操作还有文件的打开、网络连接的发起以及其他资源的分配。人们一般认为会引起问题的情形是一个线程要访问(读或更新)某对象时另一个线程正在更新它。全局对象尤其易于出现这种问题,局部对象出现问题的情况则少的多。比如:std::string x;void f() { std::string y; // modify x and y. }如果两个线程同时进入函数f(),它们拿到的对象y是不相同的,这是由于不同的线程拥有各自不同的栈,局部变量都在线程自己的栈上分配,因而每个线程都会拿到自己独立的局部变量副本。所以说,在f()中对y进行操作不会产生问题(假定操作独立的对象有安全保证),然而,全局对象x仅有一份两个线程都会触及的拷贝,对x的如上操作便会产生问题。局部变量也不是完全不会产生问题,因为每个函数都能够启动新的线程并且把局部变量的指针作为该线程的一个输入参数,比如:void f ( ) { std : : string x ; startthread (somefunction , &x); startthread (somefunction , &x); } 以下给出几个一般准则:操作系统提供的API具备线程安全性POSIX线程标准要求C标准库中的大多数函数具备线程安全性,少数例外会在C标准中注明。对于Windows提供的C标准库,如果所使用的版本没有问题,而且进行了正确的初始化,他们都是安全的。C++标准库的线程安全性不是很明确,它在很大程度上依赖于使用的编译器。标准模板库线程安全性的SGI准则作为实际中的标准取得很大进展,但并不是统一的标准。
线程安全性不是一个非真即假的命题。 Vector 的方法都是同步的,并且 Vector 明确地设计为在多线程环境中工作。但是它的线程安全性是有限制的,即在某些方法之间有状态依赖(类似地,如果在迭代过程中 Vector 被其他线程修改,那么由 Vector.iterator() 返回的 iterator会抛出ConcurrentModifiicationException)。
对于 Java 类中常见的线程安全性级别,没有一种分类系统可被广泛接受,不过重要的是在编写类时尽量记录下它们的线程安全行为。
Bloch 给出了描述五类线程安全性的分类方法:不可变、线程安全、有条件线程安全、线程兼容和线程对立。只要明确地记录下线程安全特性,那么您是否使用这种系统都没关系。这种系统有其局限性 -- 各类之间的界线不是百分之百地明确,而且有些情况它没照顾到 -- 但是这套系统是一个很好的起点。这种分类系统的核心是调用者是否可以或者必须用外部同步包围操作(或者一系列操作)。下面几节分别描述了线程安全性的这五种类别。 不可变的对象一定是线程安全的,并且永远也不需要额外的同步 。因为一个不可变的对象只要构建正确,其外部可见状态永远也不会改变,永远也不会看到它处于不一致的状态。Java 类库中大多数基本数值类如 Integer 、 String 和 BigInteger 都是不可变的。
需要注意的是,对于Integer,该类不提供add方法,加法是使用+来直接操作。而+操作是不具线程安全的。这是提供原子操作类AtomicInteger的原因。 有条件的线程安全类对于单独的操作可以是线程安全的,但是某些操作序列可能需要外部同步。条件线程安全的最常见的例子是遍历由 Hashtable 或者 Vector 或者返回的迭代器 -- 由这些类返回的 fail-fast 迭代器假定在迭代器进行遍历的时候底层集合不会有变化。为了保证其他线程不会在遍历的时候改变集合,进行迭代的线程应该确保它是独占性地访问集合以实现遍历的完整性。通常,独占性的访问是由对锁的同步保证的 -- 并且类的文档应该说明是哪个锁(通常是对象的内部监视器(intrinsic monitor))。
如果对一个有条件线程安全类进行记录,那么您应该不仅要记录它是有条件线程安全的,而且还要记录必须防止哪些操作序列的并发访问。用户可以合理地假设其他操作序列不需要任何额外的同步。 线程兼容类不是线程安全的,但是可以通过正确使用同步而在并发环境中安全地使用。这可能意味着用一个 synchronized 块包围每一个方法调用,或者创建一个包装器对象,其中每一个方法都是同步的(就像 Collections.synchronizedList() 一样)。也可能意味着用 synchronized 块包围某些操作序列。为了最大程度地利用线程兼容类,如果所有调用都使用同一个块,那么就不应该要求调用者对该块同步。这样做会使线程兼容的对象作为变量实例包含在其他线程安全的对象中,从而可以利用其所有者对象的同步。
许多常见的类是线程兼容的,如集合类 ArrayList 和 HashMap 、 java.text.SimpleDateFormat 、或者 JDBC 类 Connection 和 ResultSet 。 线程对立类是那些不管是否调用了外部同步都不能在并发使用时安全地呈现的类。线程对立很少见,当类修改静态数据,而静态数据会影响在其他线程中执行的其他类的行为,这时通常会出现线程对立。线程对立类的一个例子是调用 System.setOut() 的类。
向日葵远程控制软件安全吗安全吗
我个人认为是安全的。这款软件已经很大程度上保护了用户的隐私以及远程控制的安全,从识别码加验证码的远控方式,到国家级的安全认证,都是非常完善的。从最新的版本更新中我们可以看到,这款软件在安全方面不断实现巩固提升,加入了权限、访问、设备等维度设置多因子安全访问验证;数据传输使用AES 256位对称...
如何保证线程安全?
1、不可变 在java语言中,不可变的对象一定是线程安全的,无论是对象的方法实现还是方法的调用者,都不需要再采取任何的线程安全保障措施。如final关键字修饰的数据不可修改,可靠性最高。2、绝对线程安全 绝对的线程安全完全满足Brian GoetZ给出的线程安全的定义,这个定义其实是很严格的,一个类要达到...
安全补丁程序级别是什么意思?
安全补丁程序级别是指补丁程序对应的漏洞的严重程度,根据漏洞的影响范围、利用难度等指标来评估。一般来说,安全补丁程序级别分为严重、中等和轻微三级。严重漏洞可导致系统崩溃、数据泄露等严重后果,中等漏洞可以被攻击者利用,但对整个系统影响较小,轻微漏洞则只有很小的影响,如影响到某些功能等。为了...
非传统安全威胁_SOA的三个安全威胁
这是一个到现在都没完全解决的问题,但是SOA增加了这种安全缺陷的程度。因为SOA非常强大,而且可以被用来轻松地利用外部程序和其他外部可信任伙伴的程序,这种缺陷可能会变得非常大。企业需要谨慎地制定安全策略,加上对用户的安全意识培训,再辅以合适的技术,来将所面临的危险降到最小。最好的解决这种问题...
网络安全包括哪些方面的内容?
4. 应用程序安全:包括对网站、移动应用等应用程序的漏洞扫描和修复,确保应用程序的安全性,防止黑客利用应用程序漏洞进行攻击。5. 网络通信安全:包括加密通信、虚拟专用网络(VPN)、防火墙等安全措施,确保网络通信的机密性、完整性和可用性。6. 社交工程和用户教育:加强用户对网络安全的认知和教育,...
如何保证网站的安全性
(2)确保网站程序安全 程序是网络入侵的有效途径之一。a. 网站在开发过程中要选择安全的语言;b. 保障网站后台安全,分配好后台管理权限,在网站后期,避免后台人为误操作,必要时可采购堡垒机加强安全防护;c. 注意网站程序各方面的安全性测试,包括防止SQL注入、密码加密、数据备份、使用验证码等方面,加强...
安全操作系统分几级
系统 不要求用户进行登记(要求用户提供用户名)或口令保护(要求用户 提供唯一字符串来进行访问)。任何人都可以坐在计算机前并开始使 用它。 D1级的计算机系统包括: MS-Dos MS-Windows3.xe及Windows95(不在工作组方式中) Apple的System7.x 2、C1 级 C1级系统要求硬件有一定的安全...
如何实现线程安全?
1: 加锁 利用Synchronized或者ReenTrantLock来对不安全对象进行加锁,来实现线程执行的串行化,从而保证多线程同时操作对象的安全性,一个是语法层面的互斥锁,一个是API层面的互斥锁.2: 非阻塞同步来实现线程安全。原理就是:通俗点讲,就是先进性操作,如果没有其他线程争用共享数据,那操作就成功了...
APP如何保护自己信息安全?
2. 选择一个可靠的APP:确保所使用的应用程序没有安全漏洞或内容欺诈问题; 并且在市场中,有合适的安全策略和安全团队的应用程序更安全。3. 监控您的数据:监控掌握和使用为您有效的数据,可以通过查看APP访问系统管理工具来了解正在收集的数据。如果有一些未知数据来源,可以问问APP开发公司。4. 注销无...
计算机系统安全的含义及其重要意义是什么?
一、计算机系统面临的安全问题 目前,广域网应用已遍全省各级地税系统。广域网覆盖地域广、用户多、资源共享程度高,所面临的威胁和攻击是错综复杂的,归结起来主要有物理安全问题、操作系统的安全问题、应用程序安全问题、网络协议的安全问题。(一)物理安全问题网络安全首先要保障网络上信息的物理安全。物理...
在方美普: 线程安全是指要控制多个线程对某个资源的有序访问或修改,而在这些线程之间没有产生冲突.在Java里,线程安全一般体现在两个方面:1、多个thread对同一个java实例的访问(read和modify)不会相互干扰,它主要体现在关键字...
西平县19857421620: 什么是线程安全怎么实现线程安全 - ?
在方美普: 如果每个线程中对全局变量、静态变量只有读操作,而无写操作,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全. 线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用.不会出现数据不一致或者数据污染. 线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据
西平县19857421620: 线程安全与线程不安全的区别 - ?
在方美普: 线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用.不会出现数据不一致或者数据污染. 线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据
西平县19857421620: c++ string线程安全吗 - ?
在方美普: c++ string线程安全的总结如下: C++11标准之前,C++标准中根本没有线程的概念,所以无从谈起线程 安全,特定实现的线程安全性不能适用于所有别的实现.C++11中标准也只能保证 并发的读操作是线程安全的. 特定的实现可能可以保证某...
西平县19857421620: JAVA中线程安全的map有哪些? - ?
在方美普: JAVA中线程安全的map有:Hashtable、synchronizedMap、ConcurrentHashMap.java中map中线程安全怎么实现:1. 同步的map就是Hashtable, concurrenthashmap.2. 你看到的Hashtable就是直接在hashmap上加了个锁,concurrenthashmap...
西平县19857421620: 请简要说明java中线程安全是怎么回事? - ?
在方美普: 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的.或者说:一个类或者程序所提供的接口...
西平县19857421620: 什么是线程安全 什么是线程不安全 - ?
在方美普: 首先要明白线程的工作原理,jvm有一个main memory,而每个线程有自己的working memory,一个线程对一个variable进行操作时,都要在自己的working memory里面建立一个copy,操作完之后再写入main memory.多个线程同时操作同一个...
西平县19857421620: java的线程安全跟非安全到底是什么意思? - ?
在方美普: 一个线程安全的方法,在多个线程里竞争的调用,并不会引起数据不一致,返回结果不同于预期等情况,可以说它是线程安全的.比如下面的方法是线程安全的:public int add(int a, int b) {return a + b;},无论多少个线程同时调用这个方法,都不会因为竞争而导致错误,当然,它有可能导致溢出错误,不过这不是线程安全要关注的.再比如下面的就不是线程安全:int n = 0;public int increase() {n ++; return n;} 假设有A和B两个线程调用此方法:A 在n++之后休息了一下,别问为啥休息,它就休息了 B 这时候又n++了一下,然后两个线程都返回了结果2.
西平县19857421620: python中的线程安全和非线程安全的区别 - ?
在方美普: 线程安全和非线程安全这些概念在其他的编程语言也同样使用.所谓线程安全:就是对于多线程同时操作是是安全的而不会发生写冲突,比如python的Queue 相反非线程安全:就是多线成同时操作时会发生写冲突,比如python的其他list,set,dict
西平县19857421620: 什么才是多线程安全的 - ?
在方美普: 什么是线程安全?如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 或者说:一个类或者...