美文网首页
Java线程安全

Java线程安全

作者: 寒_蝉 | 来源:发表于2019-04-21 14:53 被阅读0次

Java线程安全

线程安全问题的产生

在多线程编程中,有可能会出现同时访问同一个资源的情况,这种资源可以是各种类型的的资源:变量、对象、文件、数据库表等,当多个线程同时访问同一个资源的时候,就会存在一个问题:
多个线程同时访问一个资源(称为临界资源或共享资源)时,会导致程序运行结果并不是想看到的结果

注:当多个线程执行一个方法,且方法内部的局部变量并不是临界资源,不会产生线程安全问题。因为方法是在栈上执行的,而Java栈是线程私有的

如何解决线程安全

基本上所有的并发模式在解决线程安全问题时,都采用序列化访问临界资源的方案,即在同一时刻,只能有一个线程访问临界资源,也称作同步互斥访问。

通常来说,是在访问临界资源的代码前面加上一个锁,当访问完临界资源后释放锁,让其他线程继续访问。

在Java中,提供了两种方式来实现同步互斥访问:synchronizedLock

synchronized

在Java中,每一个对象都拥有一个互斥锁(monitor),也称为监视器,多线程同时访问某个对象时,线程只有获取了该对象的锁才能访问。

在Java中,可以使用synchronized关键字来标记一个方法或者代码块,当某个线程调用该对象的synchronized方法或者访问synchronized代码块时,这个线程便获得了该对象的锁,其他线程暂时无法访问这个方法。待这个方法执行完毕或者代码块执行完毕,这个线程才会释放该对象的锁,其他线程才能执行这个方法或者代码块。

释放互斥锁的条件有:

  1. 获取锁的线程执行完了该代码块,线程释放对锁的占有;
  2. 线程执行发生异常,JVM会让线程自动释放锁。

注意事项:

  1. 互斥锁会对同一对象的所有synchronized方法生效,因为一个对象的互斥锁只有一个;
  2. 不同对象的互斥锁不会影响。

存在问题:
当获取锁的线程如遇到阻塞,一直占用互斥锁,其余线程只能处于等待态,会影响程序效率。

Lock

一定时间未响应后,能主动释放互斥锁

相关文章

  • 58(5.3)

    53分钟。 线程和进程区别 Java的线程安全 什么是线程安全,如何保障。哪些变量是线程安全。 Java IO 分...

  • 多线程juc锁

    java_basic 1 线程安全 在Java多线程编程当中,实现线程安全: 内部锁(Synchronized...

  • Java线程安全与锁优化

    一、Java语言中的线程安全 Java语言中各种操作共享数据分为:不可变、绝对线程安全、相对线程安全、线程兼容和...

  • 后端架构师技术图谱(三)-并发、锁、设计模式(二)

    并发 多线程 《40个Java多线程问题总结》 线程安全 《Java并发编程——线程安全及解决机制简介》 一致性、...

  • java_多线程

    java_多线程 线程创建方式;join用法; sleep和wait区别; 线程安全和不安全的java集合; St...

  • Java核心(三)并发中的线程同步与锁(转)

    解决线程安全核心思想是:“要么只读,要么加锁”,解决线程安全的关键在于合理的使用Java提供的线程安全包java....

  • 线程安全与锁优化

    线程安全 Java语言中的线程安全 线程安全的“安全程度”由强至弱来排序,将Java语言中的各种操作共享的数据分5...

  • Java线程同步策略

    线程安全 概述 引用《Java Concurrency In Practice》对线程安全的定义 当多个线程访问一...

  • 线程安全

    线程安全定义 《Java Concurrency In Practice》一书中定义“线程安全”:当多个线程访问一...

  • HashMap和HashTable的区别

    Java常见比较一 1.线程是否安全? HashMap 是非线程安全的,HashTable 是线程安全的;Hash...

网友评论

      本文标题:Java线程安全

      本文链接:https://www.haomeiwen.com/subject/vyqjgqtx.html