Skip to content

2019-10-19~2019-10-26 周分享总结 #2

@hansyyy

Description

@hansyyy

2019-10-19~2019-10-26 周分享总结

1、分享人:邓思远 | 分享日期:2019-10-19

提问:下面调用sout(SubClass.value);输出的是什么? 为什么?

public class SuperClass{

	static {
		System.out.println("SuperClass init!");
	}
	public static int value = 123;
	
}

public class SubClass extends SuperClass {

	static {
		System.out.println("SubClass init!");
	}
}

回答:

SuperClass init!
123

详情请参考链接

2、分享人:袁乙文 | 分享日期:2019-10-20

提问:StringBuffer、StringBuilder、String哪个是final类型的?

回答:都是final类,都不允许被继承;String类长度是不可变的,StringBuffer和StringBuilder类长度是可以改变的;

详情请参考链接

3、分享人:孙鹏翔 | 分享日期:2019-10-21

提问:final, finally, finalize的区别是什么?

回答:final用于声明属性,方法和类,表示属性不可变,方法不可覆盖,类不可继承。内部类要访问局部变量,局部变量必须定义成final类型。finally是异常处理语句结构的一部分,表示总是执行。finalize是Object类中的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,如关闭文件等。但是jvm不能保证此方法总被调用。

详情请参考链接

4、分享人:王增益 | 分享日期:2019-10-22

提问:可变参数是什么?

回答:可变参数关于对相同类型,但是若干个不确定蛋参数(数组都可以传)的方法。(参数类型... 参数名),函数里面可以通过foreach调用或者x.length调用。

5、分享人:姚秋鸿 | 分享日期:2019-10-23

提问:这代码序运行时有无问题?

Map<String,Boolean> map = new HashMap<String, Boolean>();
Boolean b = (map!=null ? map.get("test") : false);

回答:

详情请参考链接

6、分享人:袁乙文 | 分享日期:2019-10-24

提问:这代码序运行时有无问题?

public class Test implements Runnable {

	private int b = 1;
	
	@Override
	public void run() {
		System.out.println("A is begin");
		while(true) {
			if(b==2) {
				breeak;
			}
		}
		System.out.println("A is finish");
	}
	
	public static void main(String[] args) {
		Test a = new Test();
		new Thread(a,"A").start();
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		a.b = 2;
	}
}

回答:此问题和并发编程的可见性有关,主线程虽然修改了a.b=2,但是这个值对于子线程并不是可见的。因为他的修改只改了自己的本地内存和主内存,但是并没有强制子线程更新这个值。所以子线程的判断结果一直都是false。

A is begin

7、分享人:杨兴旺 | 分享日期:2019-10-25

提问:1.volatile能使得一个非原子操作变成原子操作吗? 2.volatile是否完全具有原子性 图中的输出结果每次是否一样?

public class VolatileDemo {
    private long value;
    public  void incre(){
        value++;
        System.out.println(value);
    }

    public static void main(String[] args){
        final VolatileDemo volatileDemo = new VolatileDemo();
        for (int i = 0; i< 10; i++){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    volatileDemo.incre();
                }
            }).start();
        }
    }
}

回答:不能。volatile不具有原子性,每次输出不一样。

8、分享人:宋丽 | 分享日期:2019-10-26

提问:当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

回答:要看这个方法是否为静态方法。非静态方法之间锁的是本类对象,其他方法就无法进行。如果是静态方法,进程拿到的锁和非静态的不是一个,所以静态方法间必须同步。另一个线程可以同时访问这个对象的非同步方法(非静态),但是不能同时访问同步方法。这里的同步方法指该静态方法本身和其他同步方法(静态)。

Metadata

Metadata

Assignees

No one assigned

    Labels

    daily shareDaily Share SummarydocumentationImprovements or additions to documentationquestionFurther information is requested

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions