本文导读目录:
![](/tutu9/24.png)
华为笔记本怎么装win系统教程(华为笔记本怎么装win系统)
本文为大家介绍华为笔记本怎么装win系统教程(华为笔记本怎么装win系统),下面和小编一起看看详细内容吧2024年12月三星a80售价(宏基电脑配置)。
华为笔记本是一款外观设计简约大方的笔记本,搭配商务风皮质键盘 保护套,相当符合当下主流人群的审美。那么如何在这款贵族笔记本上安装win系统呢?你知道使用这个品牌的用户吗?今天,小编就给大家分享一下在华为笔记本上使用U盘安装系统安装win系统的操作过程。
线程死锁?JAVA多线程死锁问题
产生死锁的原因主要是因为系统资源不足。进程运行推进的顺序不合适。资源分配不当等。如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。产生死锁的四个必要条件互斥条件:一个资源每次只能被一个进程使用。请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。
JAVA多线程死锁问题
Java中导致死锁的原因Java中死锁最简单的情况是,一个线程T持有锁L并且申请获得锁L,而另一个线程T持有锁L并且申请获得锁L,因为默认的锁申请操作都是阻塞的,所以线程T和T永远被阻塞了。导致了死锁。这是最容易理解也是最简单的死锁的形式。但是实际环境中的死锁往往比这个复杂的多。可能会有多个线程形成了一个死锁的环路,比如:线程T持有锁L并且申请获得锁L,而线程T持有锁L并且申请获得锁L,而线程T持有锁L并且申请获得锁L,这样导致了一个锁依赖的环路:T依赖T的锁L,T依赖T的锁L,而T依赖T的锁L。从而导致了死锁。从这两个例子,我们可以得出结论,产生死锁可能性的最根本原因是:线程在获得一个锁L的情况下再去申请另外一个锁L,也就是锁L想要包含了锁L,也就是说在获得了锁L,并且没有释放锁L的情况下,又去申请获得锁L,这个是产生死锁的最根本原因2024年12月三星a80售价(宏基电脑配置)。另一个原因是默认的锁申请操作是阻塞的。.Java中如何避免死锁既然我们知道了产生死锁可能性的原因,那么就可以在编码时进行规避。Java是面向对象的编程语言,程序的最小单元是对象,对象封装了数据和操作,所以Java中的锁一般也是以对象为单位的,对象的内置锁保护对象中的数据的并发访问。所以如果我们能够避免在对象的同步方法中调用其它对象的同步方法,那么就可以避免死锁产生的可能性。如下所示的代码,就存在死锁的可能性:publilassClassB{privateStringaddress;//...publicsynchronizedvoidmethod(){//dosomething}//......}publilassClassA{privateintid;privateStringname;privateClassBb;//...publicsynchronizedvoidm(){//dosomethingb.method();}//......}上面的ClassA.m()方法,在对象的同步方法中又调用了ClassB的同步方法method(),所以存在死锁发生的可能性。我们可以修改如下,避免死锁:publilassClassA{privateintid;privateStringname;privateClassBb;//...publicvoidm(){synchronized(this){//dosomething}b.method();}//......}这样的话减小了锁定的范围,两个锁的申请就没有发生交叉,避免了死锁的可能性,这是最理性的情况,因为锁没有发生交叉。但是有时是不允许我们这样做的。此时,如果只有ClassA中只有一个m这样的方法,需要同时获得两个对象上的锁,并且不会将实例属性b溢出(returnb;),而是将实例属性b封闭在对象中,那么也不会发生死锁。因为无法形成死锁的闭环。但是如果ClassA中有多个方法需要同时获得两个对象上的锁,那么这些方法就必须以相同的顺序获得锁。比如银行转账的场景下,我们必须同时获得两个账户上的锁,才能进行操作,两个锁的申请必须发生交叉。这时我们也可以打破死锁的那个闭环,在涉及到要同时申请两个锁的方法中,总是以相同的顺序来申请锁,比如总是先申请id大的账户上的锁,然后再申请id小的账户上的锁,这样就无法形成导致死锁的那个闭环。publilassAount{privateintid;//主键privateStringname;privatedoublebalance;publicvoidtransfer(Aountfrom,Aountto,doublemoney){if(from.getId()》to.getId()){synchronized(from){synchronized(to){//transfer}}}else{synchronized(to){synchronized(from){//transfer}}}}publicintgetId(){returnid;}}这样的话,即使发生了两个账户比如id=的和id=的两个账户相互转账,因为不管是哪个线程先获得了id=上的锁,另外一个线程都不会去获得id=上的锁(因为他没有获得id=上的锁),只能是哪个线程先获得id=上的锁,哪个线程就先进行转账。这里除了使用id之外,如果没有类似id这样的属性可以比较,那么也可以使用对象的hashCode()的值来进行比较。上面我们说到,死锁的另一个原因是默认的锁申请操作是阻塞的,所以如果我们不使用默认阻塞的锁,也是可以避免死锁的。我们可以使用ReentrantLock.try Lock()方法,在一个循环中,如果tryLock()返回失败,那么就释放以及获得的锁,并睡眠一小段时间。这样就打破了死锁的闭环。比如:线程T持有锁L并且申请获得锁L,而线程T持有锁L并且申请获得锁L,而线程T持有锁L并且申请获得锁L此时如果T申请锁L失败,那么T释放锁L,并进行睡眠,那么T就可以获得L了,然后T执行完之后释放L,L,所以T也可以获得L了执行完然后释放锁L,L,然后T睡眠醒来,也可以获得L,L了。打破了死锁的闭环。这些情况,都还是比较好处理的,因为它们都是相关的,我们很容易意识到这里有发生死锁的可能性,从而可以加以防备。很多情况的场景都不会很明显的让我们察觉到会存在发生死锁的可能性。所以我们还是要注意:一旦我们在一个同步方法中,或者说在一个锁的保护的范围中,调用了其它对象的方法时,就要十而分的小心:如果其它对象的这个方法会消耗比较长的时间,那么就会导致锁被我们持有了很长的时间;如果其它对象的这个方法是一个同步方法,那么就要注意避免发生死锁的可能性了;最好是能够避免在一个同步方法中调用其它对象的延时方法和同步方法。如果不能避免,就要采取上面说到的编码技巧,打破死锁的闭环,防止死锁的发生。同时我们还可以尽量使用“不可变对象”来避免锁的使用,在某些情况下还可以避免对象的共享,比如new一个新的对象代替共享的对象,因为锁一般是对象上的,对象不相同了,也就可以避免死锁,另外尽量避免使用静态同步方法,因为静态同步相当于全局锁。还有一些封闭技术可以使用:比如堆栈封闭,线程封闭,ThreadLocal,这些技术可以减少对象的共享,也就减少了死锁的可能性。
三星a80售价的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于宏基电脑配置、三星a80售价的信息别忘了在本站进行查找喔。