如何创建线程?如何保证线程安全?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何创建线程?如何保证线程安全?相关的知识,希望对你有一定的参考价值。

在java中如果要创建线程的话,一般有两种方式:

    1.继承Thread类;

    2.实现Runnable接口。

    线程安全:

    线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。 线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。

    一般说来,确保线程安全的方法有这几个:竞争与原子操作、同步与锁、可重入、过度优化。
    个人认为,保证线程安全,无外乎保持线程同步的方式,
    如:@synchronized、NSLock、dispatch_semaphore、NSCondition、pthread_mutex、OSSpinLock。
    然而:
    OSSpinLock和dispatch_semaphore的效率远远高于其他。
    @synchronized和NSConditionLock效率较差。
    鉴于OSSpinLock的不安全,所以我们在开发中如果考虑性能的话,建议使用dispatch_semaphore。
    如果不考虑性能,只是图个方便的话,那就使用@synchronized。

    如何保证呢:

    1.使用线程安全的类;

    使用synchronized同步代码块,或者用Lock锁;

    由于线程安全问题,使用synchronized同步代码块     原理:当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。     另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。

    多线程并发情况下,线程共享的变量改为方法局部级变量;



    作者:squirrels
    链接:https://www.jianshu.com/p/221df4cd63da
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

参考技术A 在java中如果要创建线程的话,一般有两种方式: 1)继承Thread类;2)实现Runnable接口。 在java中如何保证线程安全? 一般说来,确保线程安全的方法有这几个: 参考技术B 一、线程安全在三个方面体现

1.原子性:提供互斥访问,同一时刻只能有一个线程对数据进行操作,(atomic,synchronized);

2.可见性:一个线程对主内存的修改可以及时地被其他线程看到,(synchronized,volatile);

3.有序性:一个线程观察其他线程中的指令执行顺序,由于指令重排序,该观察结果一般杂乱无序,(happens-before原则)。

Controller是单例模式的吗?如何保证线程安全?

参考技术A Controller是单例模式的吗?如何保证线程安全?

答:Controller是单例的,也就是说并发请求调用Controller生成的是同一个对象。从线程安全的角度来说,这些线程共享Controller的实例对象。

接下来我们说一下线程安全的问题。首先明确一点,spring的controller是非线程安全的。既然是非线程安全的,那么我们就要注意共享内存中的对象了,这些对象必须要注意线程安全问题。

如何解决线程安全问题呢?

第一种方式,避免定义全局变量。局部变量不存在线程安全问题。

第二种方式,使用ThreadLocal来进行线程隔离。如何使用这里不再赘述。网上有很多例子。

以上是关于如何创建线程?如何保证线程安全?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建线程?如何保证线程安全?

如何创建线程?如何保证线程安全?

如何创建线程?如何保证线程安全?

如何保证ArrayList线程安全

如何保证集合是线程安全的?

如何保证线程安全?