当前位置: 首页 > news >正文

衡阳网站备案企业怎么建设网站

衡阳网站备案,企业怎么建设网站,百度权重查询入口,铁岭建设银行网站​ 公平锁#xff1a; 是指多个线程按照申请锁的顺序来获取锁#xff0c;有点先来后到的意思。在并发环境中#xff0c;每个线程在获取锁时会先查看此锁维护的队列#xff0c;如果为空#xff0c;或者当前线程是等待队列的第一个#xff0c;就占有锁#xff0c;否则就会…​ 公平锁 是指多个线程按照申请锁的顺序来获取锁有点先来后到的意思。在并发环境中每个线程在获取锁时会先查看此锁维护的队列如果为空或者当前线程是等待队列的第一个就占有锁否则就会加入到等待队列中以后会按照 FIFO 的规则从队列中取到自己。 非公平锁 指多个线程获取锁的顺序并不是按照申请锁的顺序上来就尝试占有锁如果尝试失败就再采用类似公平锁的方式获取锁。有可能后申请的线程比先申请的线程优先获取锁在高并发的情况下有可能会造成优先级反转或者饥饿现象。 ReentrantLock并发包中ReentrantLock的创建可以指定构造函数的boolean类型来得到公平锁或非公平锁默认是false非公平锁。非公平的优点在于吞吐量比公平锁大。对于Synchronized锁也是一种非公平锁。 可重入锁又名递归锁 指同一线程外层函数获得锁之后内层递归函数仍然能获取该锁的代码。也就是说线程可以进入任何一个它已经拥有的锁所同步的代码块。synchronized和unlock都是可重入锁。 //简单理解就是方法1 是一个同步方法里面包含了一个方法2 也是同步方法但是当进入方法1后也就获得了方法2的锁即可重入锁 public synchronized void method1(){System.out.println(方法1 synchronized);method2(); }public synchronized void method2(){System.out.printf(方法2 synchronized); }自旋锁 是指尝试获取锁的线程不会立即阻塞而是采用循环的方式尝试获取锁这样的好处是减少了上下文切换的消耗确定是循环会消耗CPU。循环比较直到成功为止。 public final int getAndAddInt(Object var1, long var2, int var4){int var5;do{//根据对象和地址偏移量获取内存中的值var5 this.getIntVolatile(var1, var2);//将获取到的值 var5 传入此方法内部会先比较var2地址的值是否等于 var5相等则修改var5值并返回否则重新进入循环。}while(!this.compareAndSwapInt(var1, var2, var5, var5 var4));return var5; }手写一个自旋锁 思想就是通过while中的循环条件来充当锁当条件成立时表示未获得锁进行死循环直到while条件不成立也就是获得锁。就退出死循环执行业务逻辑。具体查看如下代码 public class Test {public static void main(String[] args) throws Exception {/*执行结果展示 AA myLockBB myLockAA unLockBB unLock* 分析我们 AA 线程休眠了 5秒足以让 BB 线程执行结束那为什么 BB 执行到 myLock 之后就没有继续执行呢。* 其实BB 一直执行着只不过陷入了 while 死循环中因为 AA 将线程置为非空。* 等到 5 秒后AA unlock 重新将线程null时BB 获取线程并执行任务。over*/Test test new Test();new Thread(()-{test.myLock();try {TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}test.unLock();},AA).start();TimeUnit.SECONDS.sleep(1);new Thread(()-{test.myLock();try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}test.unLock();},BB).start();}//对线程保证原子性AtomicReferenceThread atomicReference new AtomicReference();//获取锁其实质将锁看做一个条件判断只要这个判断能够保证线程安全即可。//如下我们将线程是否为空作为条件如果是空的就没锁自己可以对其加锁将其值设为自己。//如果使用完使用unlock 将线程设置为 null其他线程通过判断来获得锁其实就像一种约定而已。public void myLock(){Thread thread Thread.currentThread();System.out.println(thread.getName() myLock);while (!atomicReference.compareAndSet(null,thread)){}}//释放锁public void unLock(){Thread thread Thread.currentThread();atomicReference.compareAndSet(thread,null);System.out.println(thread.getName() unLock);} }自旋锁的优点主要包括 【1】减少线程阻塞对于锁竞争不激烈且锁占用时间短暂的情况自旋锁能够显著提高性能因为它减少了线程因阻塞而产生的上下文切换开销。 【2】避免内核态切换与非自旋锁相比自旋锁在尝试获取锁失败时会继续执行循环而不立即陷入内核态这样可以避免线程在用户态和内核态之间的频繁切换这在一定程度上提高了系统的整体性能。 然而自旋锁也存在一些缺点 【1】高负载下效率低下如果锁竞争激烈或持有锁的线程需要长时间执行同步块自旋锁会因为不断重复无效的旋转操作而导致性能下降。在这种情况下自旋锁的消耗可能会超过线程阻塞后的恢复成本因此应该关闭自旋锁以避免不必要的性能损失。1234 【2】可能存在不公平性某些自旋锁实现如Java中的不是完全公平的这意味着它们可能无法为等待时间最长线程提供优先权这可能导致所谓的“线程饥饿”问题。 【3】单核处理器上的限制在单核处理器上自旋锁实际上没有真正的并行性因为即使当前线程不阻塞其他线程锁仍然不会被释放导致资源的浪费。此外如果处理器数量少于线程数量自旋锁也可能造成不必要的资源浪费。4 【4】不适合计算密集型任务如果任务主要是计算密集型的使用自旋锁可能会导致性能下降因为自旋锁会占用CPU资源而在计算密集型任务中减少锁的使用可能是更优的选择。 综上所述自旋锁适用于锁竞争不太激烈且锁占用时间较短的场景但在竞争激烈或锁占用时间较长的情况下其性能优势不明显甚至可能导致性能下降。 【独占锁】写锁 指该锁只能被一个线程所持有。对ReentrantLock和Synchronized而言都是独占锁。 【共享锁】读锁 指该锁可被多个线程持有。 【1】不加读写锁时代码及出现的问题如下创建5个线程进行写入5个线程进行读取。 public class ReadWriteLock {private volatile Map map new HashMap();//写入方法public void put(String k,Object v){System.out.println(Thread.currentThread().getName() 开始写入k );try {TimeUnit.MICROSECONDS.sleep(30);}catch (Exception e){e.printStackTrace();}map.put(k,v);System.out.println(Thread.currentThread().getName() 写入完成);}//读方法public void get(String k){System.out.println(Thread.currentThread().getName() 读数据开始k );try {TimeUnit.MICROSECONDS.sleep(10);}catch (Exception e){e.printStackTrace();}Object v map.get(k);System.out.println(Thread.currentThread().getName() 读数据完场完成v);}public static void main(String[] args) {ReadWriteLock readWriteLock new ReadWriteLock();//写入数据for (int i1;i6;i){final int tempInt i;new Thread(()-{readWriteLock.put(tempInt,tempInt);},String.valueOf(i)).start();}//读取数据for(int i1;i6;i){final int tempInt i;new Thread(()-{readWriteLock.get(tempInt);},String.valueOf(i)).start();}} }【2】上述代码输出如下第一个线程未写入完成时其他线程就进入了该方法进行了写操作。不符合多线程安全特性。 【3】加入读写锁ReentrantReadWriteLock读写锁位于JUC包下 public class ReadWriteLock{private volatile Map map new HashMap();private ReentrantReadWriteLock rwLock new ReentrantReadWriteLock();//写入方法public void put(String k,Object v){rwLock.writeLock().lock();try {System.out.println(Thread.currentThread().getName() 开始写入k );try {TimeUnit.MICROSECONDS.sleep(30);}catch (Exception e){e.printStackTrace();}map.put(k,v);System.out.println(Thread.currentThread().getName() 写入完成);}catch (Exception e){e.printStackTrace();}finally {rwLock.writeLock().unlock();}}//读方法public void get(String k){rwLock.readLock().lock();try {System.out.println(Thread.currentThread().getName() 读数据开始k );try {TimeUnit.MICROSECONDS.sleep(10);}catch (Exception e){e.printStackTrace();}Object v map.get(k);System.out.println(Thread.currentThread().getName() 读数据完场完成v);} catch (Exception e) {e.printStackTrace();} finally {rwLock.readLock().unlock();}}public static void main(String[] args) {ReadWriteLock readWriteLock new ReadWriteLock();//写入数据for (int i1;i6;i){final int tempInt i;new Thread(()-{readWriteLock.put(tempInt,tempInt);},String.valueOf(i)).start();}//读取数据for(int i1;i6;i){final int tempInt i;new Thread(()-{readWriteLock.get(tempInt);},String.valueOf(i)).start();}} }【4】加入读写锁后输出如下 ​
http://www.yingshimen.cn/news/108297/

相关文章:

  • 网站与网站之间做的好坏对比wordpress两栏响应式主题
  • wordpress底部浮动菜单重庆seo技术教程博客
  • 温州网站建设方案案例设计专业的网站搭建多少钱
  • 企业网站排名提升电子商务网站建设规划实践成果
  • 福州网站大全郑州网站搭建的公司
  • 网站建设板块免费下载无锡企业建站系统
  • 网站三大标签修改注意事项外贸网站哪家好
  • 保安网站建设洛阳市网站建设
  • 购物网站建设合同福州企业建站软件
  • 无锡做网站 选众诺商丘市今天确诊名单
  • 建设网站基本思路域名申请后怎么建网站
  • 西安网站制作模板html网站开发基础
  • 做门户网站的网络公司青海城乡与建设厅网站
  • 智能建筑网站360网址大全电脑版
  • 网站推广的常用途径有哪些开源seo软件
  • ios开发网站app个性化网站建设企业
  • 双创网站建设免费图片在线生成
  • 分销系统搭建做网站seo推广公司
  • 淄博专业网站建设哪家好石狮网站建设
  • 浦城 做网站百度网站标题优化
  • 网络小白如何建立个人网站做读书网站的前景
  • 广州网站开发哪家公司好廊坊关键词seo排名网站
  • 域名 放别人网站国外二维码在线查询
  • 淘宝买模板注浆做网站青岛网站
  • 应届生招聘去哪个网站perl 网站开发
  • 建设网站加盟工作室创业项目
  • 上海网站建设官方网站网站报价预算书
  • 做网站不赚钱的原因网站建设好了怎么做推广
  • 怎样做当地网站推广英文网站开发
  • 湖里区建设局网站上传商品的网站