zoukankan      html  css  js  c++  java
  • java多线程编程(1) 线程的基本知识

    在前面研究过多线程与进程的区别。

    这里在稍微总结一下:

    进程:程序动态的一次执行过程。

    线程:可以只是程序员的一部分的执行过程

    每个进程有多个线程组成,在java程序中,至少两个线程一个是垃圾回收线程和main线程。

    线程占有的资源更少,早java中就是每个线程都有自己的工作区,就是有自己独立的栈空间。多个线程共享一些内存资源,堆是共享的。

    多线程的力度小,并发度高,这样系统的吞吐量就很大,只有好处吗?调度和执行线程是需要资源的,就是像是数据库中的索引和数据库中的锁一个道理,并发会带来什么问题呢?跟db,os一样一样的。

    1.丢失更新(两个人同时读取一个账号为1000元,一个update 为1000-10,另一个Upadate为1000-800,根据先后顺序,只有200或者990写进数据库);

    2.读取脏数据

    3.不可重复读

    4死锁的产生 

    死锁产生4个的必要条件:a.互斥访问b.不可剥夺c.请求和保持d.成环等待

    破解期中之一就ok了,但是其实这里实现死锁避免的思路主要可以考虑请求和保持,还有成环等待。

    对于请求和保持,就是让线程一次要么申请全部线程,要不申请不到,这个效率太低了。

    如何避免环呢?给资源排序?数据库中给事务加了年龄,让年老的等年轻的货年轻的等年老的,不会出现相互等待。

    死锁的检测方法:死锁可以通过一个等待图中是否有环来判断,如何判断有向图有环?对了(topsort和dfs的方法)

    如果检测到死锁呢?可以剥夺其中若干事务的资源,就可以了。

    另外死锁是一种僵持的状态,如果没有外力作用,系统不能推进下去了。

     

  • 相关阅读:
    Runtime源码解析(JDK1.8)
    剑指Offer-孩子们的游戏(圆圈中最后剩下的数)
    剑指Offer-把二叉树打印成多行
    剑指Offer-按之字形顺序打印二叉树
    剑指Offer-对称的二叉树
    剑指Offer-删除链表中重复的结点
    剑指Offer-链表中环的入口结点
    剑指Offer-字符流中第一个不重复的字符
    剑指Offer-构建乘积数组
    selenium获取微博用户粉丝数
  • 原文地址:https://www.cnblogs.com/hansongjiang/p/3854114.html
Copyright © 2011-2022 走看看