存信个人页面-阿里云开发者社区

个人介绍

暂无个人介绍

擅长的技术

获得更多能力
通用技术能力:

暂时未有相关通用技术能力~

云产品技术能力:

阿里云技能认证

详细说明
  • 高分内容
  • 最新动态
  • 文章
  • 问答
正在加载, 请稍后...
暂无更多信息
正在加载, 请稍后...
暂无更多信息
正在加载, 请稍后...
暂无更多信息
  • 回答了问题 2019-07-17

    自学

    建议你先买一本基础书籍,按操作过程一步一步把程序运行起来,适合零基础学习的书籍如《Java JDK 7学习笔记》等。

    踩0 评论0
  • 回答了问题 2019-07-17

    javaweb如何去掉端口和项目名访问网站?急急急!!!

    如果使用tomcat,修改tomcat的配置文件(tomcat安装目录的conf文件夹,找到server.xml文件)即可,

    去掉端口的方法,将配置文件中的端口改为80,修改步骤:打开server.xml,修改端口为80,如下图:
    image

    去掉项目名称的方法,将配置文件中的虚拟目录名字改为/, 修改步骤:打开server.xml,修改虚拟目录名字为/,如下图:
    image

    踩0 评论0
  • 回答了问题 2019-07-17

    从一台服务器迁移到另一台服务器tomcat启动报内存溢出的问题

    两台机器的内存一样吗?如果一样再看一下tomcat的配置文件(bin 目录下的catalina.sh)一样吗?

    重点看一下JAVA_OPTS的配置,如服务器为1G内存的配置:
    JAVA_OPTS=”-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m"

    -Xms
    设置虚拟机可用内存堆的初始大小,缺省单位为字节,该大小为1024的整数倍并且要大于1MB,可用k(K)或m(M)为单位来设置较大的内存数。初始堆大小为2MB。加“m”说明是MB,否则就是KB了。
    例如:-Xms6400K,-Xms256M
    -Xmx
    设置虚拟机的最大可用大小,缺省单位为字节。该值必须为1024整数倍,并且要大于2MB。可用k(K)或m(M)为单位来设置较大的内存数。缺省堆最大值为64MB。
    例如:-Xmx81920K,-Xmx80M

    踩0 评论0
  • 回答了问题 2019-07-17

    CAS为什么会ABA问题?

    CAS是compare and swap的缩写,中文翻译成比较并交换,是一种乐观锁的机制。

    CAS虽然很高效的解决原子操作,但是CAS仍然存在三大问题。
    1.ABA问题
    2.循环时间长开销大
    3.只能保证一个共享变量的原子操作。

    1. ABA问题。因为CAS需要在操作值的时候检查下值有没有发生变化,如果没有发生变化则更新,但是如果一个值原来是A,变成了B,又变成了A,那么使用CAS进行检查时会发现它的值没有发生变化,但是实际上却变化了。ABA问题的解决思路就是使用版本号。在变量前面追加上版本号,每次变量更新的时候把版本号加一,那么A-B-A 就会变成1A-2B-3A。

    从Java1.5开始JDK的atomic包里提供了一个类AtomicStampedReference来解决ABA问题。这个类的compareAndSet方法作用是首先检查当前引用是否等于预期引用,并且当前标志是否等于预期标志,如果全部相等,则以原子方式将该引用和该标志的值设置为给定的更新值。

    关于ABA问题参考文档: http://blog.hesey.net/2011/09/resolve-aba-by-atomicstampedreference.html

    1. 循环时间长开销大。自旋CAS如果长时间不成功,会给CPU带来非常大的执行开销。如果JVM能支持处理器提供的pause指令那么效率会有一定的提升,pause指令有两个作用,第一它可以延迟流水线执行指令(de-pipeline),使CPU不会消耗过多的执行资源,延迟的时间取决于具体实现的版本,在一些处理器上延迟时间是零。第二它可以避免在退出循环的时候因内存顺序冲突(memory order violation)而引起CPU流水线被清空(CPU pipeline flush),从而提高CPU的执行效率。
    2. 只能保证一个共享变量的原子操作。当对一个共享变量执行操作时,我们可以使用循环CAS的方式来保证原子操作,但是对多个共享变量操作时,循环CAS就无法保证操作的原子性,这个时候就可以用锁,或者有一个取巧的办法,就是把多个共享变量合并成一个共享变量来操作。比如有两个共享变量i=2,j=a,合并一下ij=2a,然后用CAS来操作ij。从Java1.5开始JDK提供了AtomicReference类来保证引用对象之间的原子性,你可以把多个变量放在一个对象里来进行CAS操作。
    踩0 评论0
  • 回答了问题 2019-07-17

    关键字volatile的作用

    在并发编程中,我们通常会遇到以下三个问题:原子性问题,可见性问题,有序性问题。

    volatile关键字的作用是解决可见性问题的,但不能保证原子性,如果要保证原子性,还需要使用锁(synchronized,Lock,CAS)。

    synchronized关键字是防止多个线程同时执行一段代码,那么就会很影响程序执行效率,而volatile关键字在某些情况下性能要优于synchronized,下面列举几个Java中使用volatile的几个场景。

    1.状态标记量

    volatile boolean flag = false;
     
    while(!flag){
        doSomething();
    }
     
    public void setFlag() {
        flag = true;
    }
    volatile boolean inited = false;
    //线程1:
    context = loadContext();  
    inited = true;            
     
    //线程2:
    while(!inited ){
    sleep()
    }
    doSomethingwithconfig(context);

    2.double check

    class Singleton{
        private volatile static Singleton instance = null;
     
        private Singleton() {
     
        }
     
        public static Singleton getInstance() {
            if(instance==null) {
                synchronized (Singleton.class) {
                    if(instance==null)
                        instance = new Singleton();
                }
            }
            return instance;
        }
    }
    踩0 评论0
  • 回答了问题 2019-07-17

    我有3个关于HashMap的问题想请大家帮忙解答一下!

    HashMap桶的个数是动态变化的,在创建HashMap时,如果没有指定initialCapacity,默认是16,如果指定initialCapacity,由于HashMap的capacity都是2的幂,因此会调用tableSizeFor方法找到大于等于initialCapacity的最小的2的幂(initialCapacity如果就是2的幂,则返回的还是这个数)。之后在put数值后,会判断元素数量是否大于threshold(threshold=initialCapacity*loadFactor),如果大于,会调用resize方法,执行newCap = oldCap << 1;newThr = oldThr << 1, 将桶的个数乘以2。

    HashMap put值的时候调用的是putVal方法,共分为以下几步:
    1.如果当前map中无数据,执行resize方法。
    2.如果要插入的键值对要存放的这个位置刚好没有元素,那么把他封装成Node对象,放在这个位置上就完事了。
    3.否则的话,如果这个元素的key与要插入的一样,那么就替换一下,也完事。
    4.如果当前节点是TreeNode类型的数据,执行putTreeVal方法
    5.判断阈值,决定是否扩容

    HashMap get值的时候调用的是getNode方法,共分为以下几步:
    1.如果哈希表为空,或者没有找到节点,返回null
    2.如果桶中的第一个节点就和指定参数hash和key匹配上了,返回桶中的第一个节点
    3.如果桶中的第一个节点没有匹配上,而且有后续节点,如果当前的桶采用红黑树,则调用红黑树的get方法去获取节点。
    4.如果当前的桶不采用红黑树,即桶中节点结构为链式结构,如果当前的桶不采用红黑树,即桶中节点结构为链式结构。

    踩0 评论0
  • 回答了问题 2019-07-17

    【新手】新ECS手工部署Java Web项目

    先按照下面的步骤安装一下,有问题再继续问吧。

    ECS Windows JDK的安装与配置
    https://help.aliyun.com/knowledge_detail/40814.html

    ECS Windows系统下安装配置Tomcat方法
    https://help.aliyun.com/knowledge_detail/40753.html

    ECS Windows系统安装Mysql 的方法
    https://help.aliyun.com/knowledge_detail/40789.html

    踩0 评论0
  • 回答了问题 2019-07-17

    同一个java文件中,类外面定义的变量都是公用的

    如果调用另一个类中的静态变量(使用 static关键字),调用方式是:类名.变量名。
    如果调用的不是静态变量,调用方式是:首先创建类的对象,然后对象名.变量名。

    例如:
    public class Person {

    private static int count = 0;
    
    int id;
    String name;
    int age;
    
    public Person() {
        id = ++count;
    }
    
    public String toString() {
        return "Id:" + id + ", Name:" + name + ", Age:" + age;
    }
    
    public static void main(String[] args) {
        Person p1 = new Person();
        p1.name = "zhangsan";
        p1.age = 10;
        Person p2 = new Person();
        p2.name = "lisi";
        p2.age = 12;
        System.out.println(p1);
        System.out.println(p2);
    }

    }

    踩0 评论0
  • 回答了问题 2019-07-17

    java定义的全局变量(引用类型),加不加final有区别吗?什么区别?

    加final表示这个变更只能进行一次赋值操作,不可以改变它的值。更重要的是,final会告诉编译器,这个数据是不会修改的,那么编译器就可能会在编译时期就对该数据进行替换甚至执行计算,这样可以对我们的程序起到一点优化。

    如果不加final,那么这个变量可以随时修改他的值,区别主要是可不可以修改他的值。

    用定义全局变量的方式定义一个spring容器,然后在其它地方调用是可以的。

    踩0 评论0
  • 回答了问题 2019-07-17

    如何理解“避免上下文重复使用一个变量,使用final描述可以强制重新定义一个变量,方便更好地进行重构。”?

    大家在写代码的时候,为变量命名(尤其是临时变量)是一件很烧脑的事情,所以大家会偷懒重复使用变量名,但重复使用变量名在代码修改、代码重构时,因为修改的不彻底很容易出错,并且这类bug还很难测试出来,所以应该避免上下文重复使用一个变更,所以这种情况应该使用final关键字。

    踩0 评论0
正在加载, 请稍后...
滑动查看更多