`

如何保证线程安全 实现线程安全有那些方法

 
阅读更多

1,如何保证线程安全

不在线程之间共享状态变量

将状态变量修改成不可变的变量

在访问状态变量时使用同步

 

2,实现线程安全有那些方法

A:内置锁

public class widget{

    public synchronized void doSomething(){

       .....
    }

}

public class LoggingWidget extends Widget{

    public synchronized void doSomething(){

       System.out.println(toString()+":calling do Something");
       super.doSomething();

    }

}

 这个时候子类同步调用父类方法是可行,因为内置锁是可以被重入的,也就是子类可以获取到父类的锁,才不会造成死锁。

 

3,使用java.util.concurrent包中定义的并发类 如 

      ConcurrentHashMap

      ConcurrentLinkedQueue

      ConcurrentSkipListMap

      等等

      但是他们支持的并发实现并不一定意味着操作的原子性,他们只是保证数据结构不被破坏

 

4,添加volatile关键字

private static volatile int value=0;//你可以添加volatile关键字 然后删除synchronized关键字,但是也要看你的业务

public static void setTvalue(int n){
    value=n//这个时候,如果value+=n语句,那么这个就不是原子操作,还是要用synchronized的
}

 5,同步语句的注意

      你可以使用一个对象来标记同步块,不要使用this,因为this可能代表当前的类,this造成同步的区域是整个类,其他对象就无法调用类中不是同步的方法了,需要等待锁从this指的类中释放才能进行了。所以你可以定义一个对象,然后让同步块的锁指向整个对象来缩小同步块的锁影响范围。

       

private Object myLock=new Object();

public void add (int a ){

    synchronized(myLock){
     
        v+=a;
    }
}

 

 6,不要在同步块中调用其他的同步块

     这句话不是绝对的,如果你很了解代码的同步,锁,等信息,你可以大胆的这么做

分享到:
评论

相关推荐

    浅议单例模式之线程安全(转)

    利用类加载机制保证初始化实例时只有一个线程,线程安全且延迟初始化。 ```java public class Singleton { private Singleton() {} private static class SingletonHolder { private static final Singleton...

    关于如何解决HashMap线程安全问题的介绍

    但是需要注意,虽然这个方法可以保证基本的线程安全,但迭代仍然是非线程安全的,即不能在遍历过程中修改Map。 2. 使用ConcurrentHashMap:Java从1.5版本开始引入了ConcurrentHashMap,它是线程安全且高并发性能的...

    C#多线程List的非线程安全性

    2. 使用线程安全的集合:.NET框架提供了线程安全的集合类,如ConcurrentBag、ConcurrentQueue和ConcurrentStack等,它们在内部实现了线程同步,可以安全地在多线程环境下使用。 3. 避免在多线程环境中直接修改List...

    c# 线程安全队列的用法原理及使用示例

    在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。 在多线程并行的情况下会出现共享数据会线程间读取与写入不一直的情况...

    线程安全型栈

    为了实现线程安全型栈,需要使用互斥机制,通过信号量对临界资源的访问进行保护。 实现线程安全型栈的主要目的在于解决多线程环境下的资源竞争问题。通过对栈的操作加上互斥机制,可以确保多个线程同时访问栈时不会...

    CVI 线程锁、线程安全变量实例

    在LabWindows/CVI中,实现线程安全变量可能需要使用特定的线程库函数,如`cvAtomicInc()` 和 `cvAtomicDec()`,它们提供原子性地增加或减少变量的值。此外,还可以使用`cvMutexVar`结构体来创建自定义的线程安全变量...

    深入线程安全容器的实现方法

    本文将深入探讨线程安全容器的实现方法,以C#为例,分析ArrayList的线程安全实现,并讨论其他常见的线程安全容器。 首先,C#中的ArrayList.Synchronized方法是用来创建一个线程安全的ArrayList包装器。这个方法通过...

    C++实现线程安全队列

    在C++中,我们可以使用互斥量(Mutex)来实现线程安全的数据结构,如队列。本主题将详细介绍如何在C++中使用互斥量实现线程安全的队列,并通过测试代码验证其正确性。 首先,我们需要了解线程安全队列的基本设计。...

    使用C++11实现线程安全的单例模式

    C++11引入了新的特性,如std::mutex和std::call_once,使得实现线程安全的单例模式变得更加容易和高效。 首先,我们需要理解C++11中的线程模型。在C++11之前,C++标准并不直接支持多线程编程。C++11引入了 `...

    构建线程安全应用程序

    比如,Java的ConcurrentHashMap是一个线程安全的哈希表实现,它通过分段锁机制来实现线程安全,并提供较高的并发性能。并发集合类通常提供了比它们的同步对应物更好的性能,且更容易使用。 在编写线程安全代码时,...

    线程安全型队列的实现

    在IT领域,线程安全是多线程编程中的一个重要概念,指的是当多个线程访问同一块资源时,代码能够正确地处理并发访问,...在进行课程设计时,理解这些组件的工作原理以及它们如何协同工作以确保线程安全是至关重要的。

    java线程安全测试

    在Java中,局部变量是线程安全的,因为每个线程都有自己的局部变量副本,它们不会被其他线程修改。然而,实例变量是共享的,因此在多线程环境下需要特别注意。 以下是一些常见的线程安全问题和解决策略: 1. 数据...

    C++日志库-线程安全

    为了确保线程安全,我们需要在记录日志时进行同步控制,例如使用互斥锁(mutex)。 3. **日志输出函数**:这是核心功能,它接收日志消息并将其写入日志文件。在多线程环境中,我们需要确保每次只有一个线程可以执行...

    Qt两种方法实现多线程并安全结束线程及QMutex加锁Qt单例化实现

    本主题将详细探讨如何使用Qt的QThread类来创建和管理线程,并且安全地结束线程,同时结合QMutex进行线程同步,以及如何实现Qt的单例模式。 1. **QThread的使用**: - **创建线程**: 在Qt中,创建线程通常是通过...

    C# 高效线程安全,解决多线程写txt日志类.zip

    在C#中,实现线程安全通常有几种策略:锁(Lock)、Monitor、Mutex、Semaphore以及线程局部存储(ThreadLocal)等。 这个压缩包中的"TestConsoleApp"很可能是一个演示程序,展示了如何使用封装好的线程安全日志类。在...

    Java多线程安全集合

    - `ConcurrentLinkedQueue`:无界的线程安全队列,基于链接节点实现,适合高并发场景。 - `LinkedBlockingQueue`:有界线程安全队列,适合生产者-消费者模型。 3. 不可变集合(Immutable Collections): 例如`...

    易语言线程安全之原子锁与读写锁

    易语言提供了丰富的支持,使得开发者能够方便地在自己的程序中实现线程安全,从而构建高效且稳定的多线程应用程序。通过合理利用原子操作和读写锁,可以有效地解决并发编程中的数据竞争问题,提升程序的并发性能和...

    线程安全测试类

    在这里,`lock`对象是同步代码块的锁,确保了即使有多个`MyClass`的实例,每个实例的`method()`方法仍然能够独立地保持线程安全。 2. **线程执行顺序**:`synchronized`不仅可以保证线程安全,还可以影响线程的执行...

    3种多线程实现同步方法

    EnterCriticalSection和LeaveCriticalSection函数用于进入和离开临界区,保证了线程的安全执行。 最后,我们讨论**互斥对象**。互斥量是另一种互斥访问的同步工具,与临界区类似,但更适用于跨进程的同步。在C++11...

Global site tag (gtag.js) - Google Analytics