多线程的安全问题

简介: 多线程的安全问题

什么是多线程安全问题:

       一个直接的表现是,单线程情况下,程序的运行结果是正确的。应用多线程后,程序的运行结果可能会出现错误情况。

问题出现的原因:

       当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来。导致共享数据的错误。

解决办法:

       对多条操作共享数据的语句,只能让一个线程都执行完。在执行过程中,其他线程不能执行。

两种解决方式:

       1、同步代码块

1. Object obj = new Object();
2. synchronized(obj){
3. if(tick>0){
4. try{Thread.sleep(10);}catch(Exception e){}
5.             System.out.println(Thread.currentThread().getName()+"code : " + tick--);
6.         }
7.     }


       2、同步函数

1. public synchronized void show(){
2. synchronized(obj){
3. if(tick>0){
4. try{Thread.sleep(10);}catch(Exception e){}
5.                 System.out.println(Thread.currentThread().getName()+"code : " + tick--);
6.             }
7.         }
8.     }


同步的前提:

       1、必须要有两个或两个以上的线程。

       2、必须是多个线程使用同一个锁。

同步的好处:能解决线程安全问题。

同步的弊端:每次都要判断锁,较为消耗资源。

要用好同步的关键是:

       1、明确哪些代码是多线程运行代码。

       2、明确共享数据。

       3、明确多线程运行代码中哪些语句是操作共享数据的。


锁:

       1、同步代码块的锁是object

       2、同步函数使用的锁是this

       3、静态同步函数的锁是类名.class对象

           静态进内存时,内存中没有本类对象,但是一定有该类对应的字节码文件对象。

           静态的同步方法,使用的锁是该方法所在类的字节码文件对象。也就是:类名.class

死锁:

       不同的线程分别占有不同的锁,然后去获取对方的锁,这个时候就会出现死锁。在死锁时,线程间相互等待资源,而又不释放自身的资源,导致无穷无尽的等待,其结果是系统任务永远无法执行完成。死锁问题是在多线程开发中应该坚决避免和杜绝的问题。

       同步中嵌套同步的情况下可能会出现死锁。

两种创建死锁的方式:同步函数里面带个同步代码块。同步代码块里带个同步代码块。

如何避免死锁的发生:

  1.        1、加锁顺序
  2.        2、加锁时限
  3.        3、死锁检测
  4.        参照: http://wiki.jikexueyuan.com/project/java-concurrent/deadlock-prevention.html 

总结:

       多线程的应用过程中要紧要注意的就是线程安全问题。还要在实践中多多了解。


相关文章
|
6月前
|
缓存 安全 Java
为什么全局变量可能成为多线程环境中的安全隐患
为什么全局变量可能成为多线程环境中的安全隐患
|
5月前
|
安全 Java
java线程之List集合并发安全问题及解决方案
java线程之List集合并发安全问题及解决方案
866 1
|
6月前
|
安全
python_threading多线程、queue安全队列
python_threading多线程、queue安全队列
53 2
|
6月前
|
缓存 安全 Java
7张图带你轻松理解Java 线程安全,java缓存机制面试
7张图带你轻松理解Java 线程安全,java缓存机制面试
|
3月前
|
Java
【Java集合类面试十二】、HashMap为什么线程不安全?
HashMap在并发环境下执行put操作可能导致循环链表的形成,进而引起死循环,因而它是线程不安全的。
|
3月前
|
安全 算法 Java
【Java集合类面试二】、 Java中的容器,线程安全和线程不安全的分别有哪些?
这篇文章讨论了Java集合类的线程安全性,列举了线程不安全的集合类(如HashSet、ArrayList、HashMap)和线程安全的集合类(如Vector、Hashtable),同时介绍了Java 5之后提供的java.util.concurrent包中的高效并发集合类,如ConcurrentHashMap和CopyOnWriteArrayList。
【Java集合类面试二】、 Java中的容器,线程安全和线程不安全的分别有哪些?
|
3月前
|
存储 安全 Java
解锁Java并发编程奥秘:深入剖析Synchronized关键字的同步机制与实现原理,让多线程安全如磐石般稳固!
【8月更文挑战第4天】Java并发编程中,Synchronized关键字是确保多线程环境下数据一致性与线程安全的基础机制。它可通过修饰实例方法、静态方法或代码块来控制对共享资源的独占访问。Synchronized基于Java对象头中的监视器锁实现,通过MonitorEnter/MonitorExit指令管理锁的获取与释放。示例展示了如何使用Synchronized修饰方法以实现线程间的同步,避免数据竞争。掌握其原理对编写高效安全的多线程程序极为关键。
63 1
|
4月前
|
缓存 安全 Java
多线程线程池问题之为什么手动创建的线程池比使用Executors类提供的线程池更安全
多线程线程池问题之为什么手动创建的线程池比使用Executors类提供的线程池更安全
|
4月前
|
设计模式 安全 NoSQL
Java面试题:设计一个线程安全的单例模式,并解释其内存占用和垃圾回收机制;使用生产者消费者模式实现一个并发安全的队列;设计一个支持高并发的分布式锁
Java面试题:设计一个线程安全的单例模式,并解释其内存占用和垃圾回收机制;使用生产者消费者模式实现一个并发安全的队列;设计一个支持高并发的分布式锁
65 0
|
4月前
|
安全 Java 调度
Java面试题:Java内存优化、多线程安全与并发框架实战,如何在Java应用中实现内存优化?在多线程环境下,如何保证数据的线程安全?使用Java并发工具包中的哪些工具可以帮助解决并发问题?
Java面试题:Java内存优化、多线程安全与并发框架实战,如何在Java应用中实现内存优化?在多线程环境下,如何保证数据的线程安全?使用Java并发工具包中的哪些工具可以帮助解决并发问题?
61 0