首页 文章 精选 留言 我的

精选列表

搜索[java],共10000篇文章
优秀的个人博客,低调大师

使用MaxCompute Java SDK运行安全相关命令

使用MaxCompute Console的同学,可能都使用过MaxCompute安全相关的命令。官方文档上有详细的MaxCompute 安全指南 ,并给出了安全相关语句汇总 。 简而言之, 权限管理 、 列级别访问控制 、 项目空间安全配置 以及 跨项目空间的资源分享 都属于 MaxCompute 安全命令相关的范畴。 再直白一点,以下列关键字开头的命令,都是MaxCompute安全相关操作命令: GRANT/REVOKE ... SHOW GRANTS/ACL/PACKAGE/LABEL/ROLE/PRINCIPALS SHOW PRIV/PRIVILEGES LIST/ADD/REOVE USERS/ROLES/TRUSTEDPROJECTS DROP/CREATE ROLE CLEAR EXPIRED GRANTS DESC/DESCRIB

优秀的个人博客,低调大师

Java高并发之从零到放弃

前言 本篇主要讲解如何去优化锁机制或者克服多线程因为锁可导致性能下降的问题 ThreadLocal线程变量 有这样一个场景,前面是一大桶水,10个人去喝水,为了保证线程安全,我们要在杯子上加锁导致大家轮着排队喝水,因为加了锁的杯子是同步的,只能有一个人拿着这个唯一的杯子喝水这样子大家都喝完一杯水需要很长的时间如果我们给每个人分发一个杯子呢?是不是每人喝到水的时间缩小到了十分之一 多线程并发也是一个道理在每个Thread中都有自己的数据存放空间(ThreadLocalMap)而ThreadLocal就是在当前线程的存放空间中存放数据下面这个例子,在每个线程中存放一个arraylist,而不是大家去公用一个arraylist publicclassThreadLocalTest{ publicstaticThreadLocalthreadLocal=newThreadLocal(); publicstaticArrayListlist=newArrayList(); publicstaticclassDemoimplementsRunnable{ privateinti; publicDemo(inti){ this.i=i; } @Override publicvoidrun(){ list.add(i); threadLocal.set(list); System.out.println(threadLocal.get()); } } publicstaticvoidmain(String[]args)throwsInterruptedException{ ExecutorServicees=Executors.newFixedThreadPool(5); for(intj=0;j<200;j++){ es.execute(newDemo(j)); } Thread.sleep(3000); System.out.println(list.size()); es.shutdown(); } } 在每个线程内部有一块存储区域叫做ThreadLocalMap可以看到,ThreadLocal采用set,get存取值方式只有线程完全关闭时,在ThreadLocalMap中的数据才会被GC回收 这时有一个值得考虑的问题我们使用线程池来开发的时候,线程池中的线程并不会关闭,它只是处于空闲状态也就是说,我们如果把过大的数据存储在当前线程的ThreadLocalMap中,线程不断的调用,被空闲...最后会导致内存溢出解决方法是当不需要这些数据时使用ThreadLocal.remove()方法将变量给移除 CAS操作 还有一种脱离锁的机制,那就是CASCAS带着三个变量,分别是:V更新变量:需要返回的变量E预期值:原来的值N新值,传进来的新变量 只有当预期值和新值相等时,才会把V=N,如果不相等,说明该操作会让数据无法同步根据上面的解释,大概就能知道CAS其实也是在保护数据的同步性 当多个线程进行CAS操作时,可想只有一个线程能成功更新,之后其它线程的E和V会不地进行断比较所以CAS的同步锁的实现是一样的 CAS操作的并发包在Atomic包中,atomic实现了很多类型不管是AtomicInteger还是AtomicReference,都有相同点,请观察它们的源码: privatevolatileVvalue; privatestaticfinallongvalueOffset; 以上是AtomicReferenc privatevolatileintvalue; privatestaticfinallongvalueOffset; 以上是AtomicIntege 都有value,这是它们的当前实际值 valueOffset保存的是value的偏移量 下面给出一个简单的AtomicIntege例子: publicclassAtomicTest{ publicstaticAtomicIntegeratomicInteger=newAtomicInteger(); //publicstaticAtomicReferenceatomicReference=newAtomicReference(); publicstaticclassDemoimplementsRunnable{ @Override publicvoidrun(){ for(intj=0;j<1000;j++){ atomicInteger.incrementAndGet();//当前值加1并且返回当前值 } } } publicstaticvoidmain(String[]args)throwsInterruptedException{ ExecutorServicees=Executors.newFixedThreadPool(10); for(inti=0;i<10;i++){ es.submit(newDemo()); } Thread.sleep(5000); System.out.println(atomicInteger); } } 你试着执行一下,如果打印出10000说明线程安全 使用CAS操作比同步锁拥有更好的性能 我们来看下incrementAndGet()的源码: publicfinalintincrementAndGet(){ returnunsafe.getAndAddInt(this,valueOffset,1)+1; } 来看下getAndAddInt()源码: publicfinalintgetAndAddInt(Objectvar1,longvar2,intvar4){ intvar5; do{ var5=this.getIntVolatile(var1,var2); }while(!this.compareAndSwapInt(var1,var2,var5,var5+var4)); returnvar5; } 这里有一个循环,再细看源码发现是native的,虽然看不到原生代码,但是可以看出它这里做了一个CAS操作,不断地进行多个变量的比较,只有预设值和新值相等时,才跳出循环var5就是需要更新的变量,var1和var2是预设值和新值 死锁 讲了那么多无锁的操作,我们来看一下一个死锁的现象两个线程互相占着对方想得到的锁,就会出现死锁状况 publicclassDeadLockextendsThread{ protectedStringsuo; publicstaticStringzuo=newString(); publicstaticStringyou=newString(); publicDeadLock(Stringsuo){ this.suo=suo; } @Override publicvoidrun(){ if(suo==zuo){ synchronized(zuo){ System.out.println("拿到了左,正在拿右......"); synchronized(you){ System.out.println("拿到了右,成功了"); } } } if(suo==you){ synchronized(you){ System.out.println("拿到了右,正在拿左......"); synchronized(zuo){ System.out.println("拿到了zuo,成功了"); } } } } publicstaticvoidmain(String[]args)throwsInterruptedException{ for(inti=0;i<10000;i++){ DeadLockt1=newDeadLock(zuo); DeadLockt2=newDeadLock(you); t1.start();t2.start(); } Thread.sleep(50000); } } 如图: 出现了两个线程的死锁现象,所以说去锁不仅能提升性能,也能防止死锁的产生。 本文地址https://segmentfault.com/a/1190000012218687

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册