b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

Java并发-什么是线程安全(1)

电脑杂谈  发布时间:2020-05-31 01:25:41  来源:网络整理

线程安全问题代码_c++ 线程 安全_线程通信问题

并发(concurrency)是一个熟悉的词. 简而言之,这意味着CPU同时执行多个任务.

Java并发是通过多线程实现的.

在jvm的世界中,线程就像无关的并行空间线程安全问题代码,在虚拟机中序列化. (当然,这是一个更笼统的语句. 线程可以交互,并且不一定是串行的. )

多线程的存在是为了挤压CPU,提高程序性能并降低设计复杂度(设计程序时要考虑实际的时间思考).

似乎线程是传说中的头,但事实告诉我们,真正的头不存在

死锁和脏数据是典型的线程安全问题.

线程安全问题代码_c++ 线程 安全_线程通信问题

简单来说,线程安全性是: 在多线程环境中,始终可以保证程序的正确性

仅在存在共享数据时才需要考虑线程安全性

方法区域和堆是主线程共享区域. 因此,这意味着共享对象只能是类的属性域或静态域

如果您在Google上进行搜索,将会有很多这样的“定义”:

线程安全代码是可以由多个线程同时执行的代码. 如果一段代码可以确保多个线程正确访问共享数据,那么它是线程安全的

线程安全问题代码_c++ 线程 安全_线程通信问题

您是否认为上述定义似乎并没有传达任何有意义的信息,但是会让您更加困惑吗?尽管这些定义是正确的,但事实是它们没有提供任何实际的帮助和观点.

我们如何区分线程安全和不安全?线程“安全”是什么意思?

线程安全性任何正确定义的核心都与线程安全性的准确性有关. 因此,在了解线程安全性之前,我们应该首先了解这种“正确性”

正确性意味着该类的行为符合规范

您当然同意这个定义. 一个好的类规范会随时获取该类的状态信息并可以对其进行操作. 通常我们没有准则来定义我们的类是否符合规范,我们如何知道它们是正确的?我当然不知道,但是一旦我们使“代码有效”,我们仍然可以使用它. 这种“代码置信度”与我们的正确性方法有关

只要我们可以理解“正确性”,我们就可以用非的解释来定义它: 当一个类被多个线程访问并正确运行时,它是线程安全的<

线程通信问题_c++ 线程 安全_线程安全问题代码

当多个线程访问某各类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或者协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的。

线程安全的一个很好的例子是没有字段和引用的Servlet类,它是无状态的,因为没有字段和引用

public class StatelessFactorizer implements Servlet{
    public void service(ServletRequest req, ServletResponse resp) {
        BigInteger i = extractFromRequest(req);
        BigInteger[] factors = factor(i);
        encodeIntoResponse(resp, factors);
    }
}

特定计算的临时状态存储程堆栈的局部变量表中,并且只能由当前正在执行的线程访问. 线程A对StatelessFactorizer的访问不会影响线程B对同一StatelessFactorizer的访问;因为两个线程不共享状态,所以就像访问不同的实例. 由于访问无状态对象时线程的操作不会影响其他线程中操作的正确性,因此无状态对象是线程安全的

多线程假设: 众所周知,Servlet被设计为单个实例,在请求进入tomcat之后,连接器建立连接,然后将请求分发给内部线程池中的处理器,

Servlet现在处于多线程环境中. 也就是说,如果有多个请求同时访问一个servlet,则可能有多个线程同时访问该servlet对象.

线程通信问题_线程安全问题代码_c++ 线程 安全

多线程模型下的并发访问策略

1,java监视模式. 始终使用特定对象的锁来保护特定状态.

2. 线程安全委托. 将类的线程安全委托给一个或多个线程安全状态变量(请注意,当有多个线程安全状态变量时,这些变量必须彼此独立,并且不存在关联的不变性条件)

a. 锁可以使它保护的代码以串行形式访问. 当复合操作被锁定时,可以使其成为原子操作. 一个错误的想法是,只要锁定写入数据的方法,这实际上是错误的. 无论是读取还是写入,都必须锁定所有操作数据的方法

b. 锁定时需要考虑性能. 您不一定总是盲目地锁定整个方法并进行同步. 您应该分离出不影响共享状态并且执行时间较长的代码

c. 锁定的含义不仅限于互斥,还包括可见性. 为了确保所有线程都能看到最新值,必须对读取和写入操作使用相同的锁对象

无状态对象: 无状态对象必须是线程安全的,因为它们不会影响其他线程

线程关闭: 仅在单线程环境中使用

最终修改的对象可用于确保线程安全. 由于最终修改的参考变量(String除外)是不可变的,因此它们是不可变的准则,但是它们指向的对象是可变的线程安全问题代码,因此必须安全地释放此类. 换句话说,它无法提供可以修改最终对象的外部接口


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-228278-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...