`
bingzhen66
  • 浏览: 37026 次
文章分类
社区版块
存档分类
最新评论

33.黑马程序员-多线程(安全)

 
阅读更多

------- android培训java培训、期待与您交流! ----------

一.多线程安全
1.通过分析发现,多线程卖票时出现了 0,-1,-2等错票。
2.多线程的运行出现了安全问题。
3.问题出现的原因:
  • 当多条语句在操作同意线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行玩,
  • 另一个线程参与进来执行。导致共享数据的错误。
4.解决方法:
  • 对多条操作共享数据的语句,只能让一个线程都执行完。在执行过程中,其他线程不可以参与执行。
  • java对于多线程的安全问题提供了专业的解决方式。
  • 就是同步代码块
  • synchronized(对象)//这个对象可以是任意对象,例如Object。
          • //对象如同锁,持有锁的线程可以在同步中执行。没有锁的线程即使获取CPU的执行权,也进不去,因为没有获取锁。
  • {
    • 需要被同步的代码
      • //这个代码不包括共享数据,只包括判断与结论等不能分割的数据。
  • }
5.同步代码块:
  • 经典同步例子:火车上的卫生间,没人的时候可以进,进去以后锁门变成有人。再来人一看有人只能等待,等里面的人打开锁出来以后,外面的人才能进去。
  • 同步代码块定义方法:
    • synchronized(对象)//这个对象可以是任意对象,例如Object,这样做是为了减小锁的粒度,建议使用更经济的空byte数组对象做锁。
      • //对象如同锁,持有锁的线程可以在同步中执行。没有锁的线程即使获取CPU的执行权,也进不去,因为没有获取锁。
    • {
      • 需要被同步的代码//这个代码不包括共享数据,只包括判断与结论等不能分割的数据。
    • }
  • 同步的前提:
    • 必须有两个或以上的线程。
    • 必须是多个线程使用同一个锁。必须保证同步中只能有一个线程在运行。
  • 同步的好处:
    • 解决了多线程的安全问题。
  • 同步的弊端:
    • 多个线程需要判断锁,较为消耗资源。
  • 哪些时候使用同步?
    • 1.明确哪些代码是多线程运行代码。
    • 2.明确共享数据。
    • 3.明确多线程运行代码中哪些语句是操作共享数据的。
6.同步函数
  • 1.把synchronized放在声明函数上,就是同步函数。这个函数只能一个线程执行完,才能轮到下一个线程。
  • 2.如果同步函数被静态修饰时,这时候使用的锁就不是this,因为类直接调用还没对象,这个对象是类名.Class(字节码文件对象)。
  • 同步函数定义:
    • public synchronized void add (int n)//注意这里与同步代码块的区别,同步函数没有定义对象,对象默认是this。
    • {
      • //需要加锁的代码
    • }
7.多线程同步应用--单例设计模式
  • 单例分懒汉式和饿汉式。
  • 代码必须记住
  • 懒汉式的特点是延迟加载,但是多线程访问的时候会出现安全问题。解决方法是加同步,同步代码块或者同步函数都可以,但是稍微有些低效。用双重判断的格式能解决效率的问题。加同步的时候使用的锁是该类所属的字节码文件(类名.Class)。
8.死锁
  • 概念:
    • 出现的原因:同步中嵌套同步,而锁不同
    • A持有一个锁,B也有一个锁,A要访问B的锁,B也要访问A的锁,这时发生死锁。
    • 死锁程序












分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics