Java--辨别线程安全与线程不安全

    xiaoxiao2023-11-17  143

    在学习Java的时候经常会发现有很多名称相似的类,比如HashMap和Hashtable,StringBuffer和StringBuilder等等,他们的名称相似,功能也有相似的地方,所以初学者在学习之中往往会很疑惑,他们都有哪些不同呢?而在深入研究这个问题的时候,就会发现他们都有这样两个概念,线程安全和线程不安全,这也就是本文主要讲的内容。 1.什么是线程安全和线程不安全呢?

    线程安全是指多个线程在执行同一段代码的时候采用加锁机制,使每次的执行结果和单线程执行的结果都是一样的,不存在执行结果的二义性。 线程不安全就是不提供加锁机制保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据

    2.是什么决定的线程安全问题呢? 线程安全问题都是由全局变量及静态变量引起的。 若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。

    3.有哪些可以解决多线程并发访问资源的安全问题呢? 有三种方式:分别是 同步代码块 、同步方法和锁机制(Lock)

    (1)同步代码块: synchronized(同步锁) {      //方法体

    } (2)同步方法:给多线程访问的成员方法加上synchronized修饰符 public synchronized  void test(){      //方法体 }

    以上两种该方法都用到了Java语言的关键字synchronized,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。

    (3)锁机制(Lock) //Java提供的同步代码块的另一种机制,比synchronized关键字更强大也更加灵活。 //这种机制基于Lock接口及其实现类(例如:ReentrantLock) //它比synchronized关键字好的地方: //1、提供了更多的功能。tryLock()方法的实现,这个方法试图获取锁, //如果锁已经被其他线程占用,它将返回false并继续往下执行代码。 //2、Lock接口允许分离读和写操作,允许多个线程读和只有一个写线程。 //3、具有更好的性能  public class PrintQueue {       private final Lock A=new ReentrantLock();       //...  }

    4、线程的同步:

    当两个或两个以上的线程需要共享资源,他们需要某种方法来确定资源在某一刻仅被一个线程占用,达到此目的的过程叫做同步(synchronization)。

    同步代码块:synchronized(对象){},将需要同步的代码放在大括号中,括号中的对象即为锁。

    同步函数:放于函数上,修饰符之后,返回类型之前。

    5、wait和sleep的区别:(执行权和锁区分)

    wait:可指定等待的时间,不指定须由notify或notifyAll唤醒。

           线程会释放执行权,且释放锁。

    sleep:必须制定睡眠的时间,时间到了自动处于临时(阻塞)状态。

           即使睡眠了,仍持有锁,不会释放执行权。

     

    Android下 的进程与线程:

    1、进程的生命周期:

    1)、进程的创建及回收:

           进程是被系统创建的,当内存不足的时候,又会被系统回收

    2)、进程的级别:

    Foreground Process              前台进程

    Visible Process              可视进程

    Service Process             服务进程:可以提高级别的

    Background Process       后台进程

    Empty Process              空进程(无组件启动,做进程缓存使用,恢复速度快)

     

    总结用的安全与不安全API

      Hashtable-->HashMap

      StringBuffer-->StringBuilder

      线程安全就是为了在单们时间内某个线程操作的是同样的数据

    最新回复(0)