<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>精选 on 庞玉栋个人博客</title><link>https://pangyd.com/tags/%E7%B2%BE%E9%80%89/</link><description>Recent content in 精选 on 庞玉栋个人博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sat, 11 Nov 2017 20:51:11 +0800</lastBuildDate><atom:link href="https://pangyd.com/tags/%E7%B2%BE%E9%80%89/index.xml" rel="self" type="application/rss+xml"/><item><title>Java精选笔试题</title><link>https://pangyd.com/post/166-java/</link><pubDate>Sat, 11 Nov 2017 20:50:26 +0800</pubDate><guid>https://pangyd.com/post/166-java/</guid><description>&lt;p>&lt;span>合抱之木，生于毫末；九层之台，起于垒土；千里之行；始于足下。赶快测测你的Java基础知识掌握的如何？&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;br>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;/span>&lt;/p>&lt;p>&lt;img class="" data-ratio="0.5625" data-s="300,640" data-src="https://pangyd.com/uploads/2017/11/74c10f869f038762.jpg" data-type="jpeg" data-w="640" width="100%" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E" data-fail="0">&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;span>&lt;/span>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;/p>&lt;section data-role="outer" label="Powered by 135editor.com">&lt;section class="" data-tools="135编辑器" data-id="86516">&lt;section>&lt;h4>&lt;span>&lt;span>1，volatile关键字是否能保证线程安全？（）&lt;/span>&lt;/span>&lt;/h4>&lt;/section>&lt;/section>&lt;/section>&lt;p>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;span>&lt;/span>&lt;/p>&lt;p>&lt;/p>&lt;section data-role="outer" label="Powered by 135editor.com">&lt;section class="" data-tools="135编辑器" data-id="85988">&lt;section data-width="100%">&lt;p>&lt;span>&lt;br>&lt;/span>&lt;/p>&lt;/section>&lt;/section>&lt;section class="" data-tools="135编辑器" data-id="85988">&lt;section data-width="100%">&lt;p>&lt;span>&amp;gt;&lt;/span>&lt;span>&amp;gt;&lt;/span>&lt;span>&amp;gt;&lt;/span>&lt;span>&amp;gt;&lt;/span>&lt;/p>&lt;section>&lt;p class="" data-brushtype="text">&lt;span>答案：否&lt;/span>&lt;/p>&lt;/section>&lt;/section>&lt;/section>&lt;p>&lt;br>&lt;/p>&lt;/section>&lt;p>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;span>&lt;/span>&lt;/p>&lt;p>&lt;span>volatile关键字用在多线程同步中，可保证读取的可见性，JVM只是保证从主内存加载到线程工作内存的值是最新的读取值，而非cache中。但多个线程对volatile的写操作，无法保证线程安全。&lt;br>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;br>&lt;/span>&lt;/p>&lt;p>&lt;span>假如线程1，线程2 在进行read,load 操作中，发现主内存中count的值都是5，那么都会加载这个最新的值，在线程1对count进行修改之后，会write到主内存中，主内存中的count变量就会变为6；线程2由于已经进行read,load操作，在进行运算之后，也会更新主内存count的变量值为6；导致两个线程及时volatile关键字修改之后，还是会存在并发的情况。&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;br>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;/span>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;/p>&lt;section data-role="outer" label="Powered by 135editor.com">&lt;section class="" data-tools="135编辑器" data-id="86516">&lt;section>&lt;h4>&lt;span>&lt;span>2，下面哪个流类属于面向字符的输入流(&amp;nbsp; )&lt;/span>&lt;/span>&lt;/h4>&lt;/section>&lt;/section>&lt;/section>&lt;p>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;span>&lt;br>&lt;/span>&lt;/p>&lt;p>&lt;span>A、BufferedWriter&lt;/span>&lt;/p>&lt;p>&lt;span>B、FileInputStream&lt;/span>&lt;/p>&lt;p>&lt;span>C、ObjectInputStream&lt;/span>&lt;/p>&lt;p>&lt;span>D、InputStreamReader&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;br>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;/span>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;/p>&lt;section data-role="outer" label="Powered by 135editor.com">&lt;section class="" data-tools="135编辑器" data-id="85988">&lt;section data-width="100%">&lt;section>&lt;span>&amp;gt;&lt;/span>&lt;span>&amp;gt;&lt;/span>&lt;span>&amp;gt;&lt;/span>&lt;span>&amp;gt;&lt;/span>&lt;/section>&lt;section>&lt;p class="" data-brushtype="text">&lt;span>答案：D&lt;/span>&lt;/p></description></item><item><title>【分享】Java并发面试题精选</title><link>https://pangyd.com/post/101-java/</link><pubDate>Wed, 13 Sep 2017 20:20:01 +0800</pubDate><guid>https://pangyd.com/post/101-java/</guid><description>&lt;p>1，什么是线程？&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>线程是操作系统能够进行运算调度的最小单位，它被包含在进程之中，是进程中的实际运作单位。程序员可以通过它进行多处理器编程，你可以使用多线程对运算密集型任务提速。比如，如果一个线程完成一个任务要100毫秒，那么用十个线程完成改任务只需10毫秒。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>2，线程和进程有什么区别？&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>线程是进程的子集，一个进程可以有很多线程，每条线程并行执行不同的任务。不同的进程使用不同的内存空间，而所有的线程共享一片相同的内存空间。每个线程都拥有单独的栈内存用来存储本地数据。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>3，如何在Java中实现线程？&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>两种方式：java.lang.Thread 类的实例就是一个线程但是它需要调用java.lang.Runnable接口来执行，由于线程类本身就是调用的Runnable接口所以你可以继承java.lang.Thread 类或者直接调用Runnable接口来重写run()方法实现线程。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>4，Java 关键字volatile 与 synchronized 作用与区别？&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>1，volatile&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>它所修饰的变量不保留拷贝，直接访问主内存中的。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>在Java内存模型中，有main memory，每个线程也有自己的memory (例如寄存器)。为了性能，一个线程会在自己的memory中保持要访问的变量的副本。这样就会出现同一个变 量在某个瞬间，在一个线程的memory中的值可能与另外一个线程memory中的值，或者main memory中的值不一致的情况。 一个变量声明为volatile，就意味着这个变量是随时会被其他线程修改的，因此不能将它cache在线程memory中。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>2，synchronized&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>当它用来修饰一个方法或者一个代码块的时候，能够保证在同一时刻最多只有一个线程执行该段代码。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时，一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>二、然而，当一个线程访问object的一个synchronized(this)同步代码块时，另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>三、尤其关键的是，当一个线程访问object的一个synchronized(this)同步代码块时，其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>四、当一个线程访问object的一个synchronized(this)同步代码块时，它就获得了这个object的对象锁。结果，其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>五、以上规则对其它对象锁同样适用。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>5，有哪些不同的线程生命周期？&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>当我们在Java程序中新建一个线程时，它的状态是New。当我们调用线程的start()方法时，状态被改变为Runnable。线程调度器会为Runnable线程池中的线程分配CPU时间并且讲它们的状态改变为Running。其他的线程状态还有Waiting，Blocked 和Dead。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>6，你对线程优先级的理解是什么？&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>每一个线程都是有优先级的，一般来说，高优先级的线程在运行时会具有优先权，但这依赖于线程调度的实现，这个实现是和操作系统相关的(OS dependent)。我们可以定义线程的优先级，但是这并不能保证高优先级的线程会在低优先级的线程前执行。线程优先级是一个int变量(从1-10)，1代表最低优先级，10代表最高优先级。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>7，什么是死锁(Deadlock)？如何分析和避免死锁？&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>死锁是指两个以上的线程永远阻塞的情况，这种情况产生至少需要两个以上的线程和两个以上的资源。&lt;/p></description></item><item><title>转载自【Java编程精选】20个非常有用的Java程序片段</title><link>https://pangyd.com/post/28-java20java/</link><pubDate>Wed, 02 Aug 2017 19:26:36 +0800</pubDate><guid>https://pangyd.com/post/28-java20java/</guid><description>&lt;p>&lt;span>下面是20个非常有用的Java程序片段，希望能对你有用。&lt;strong>内容比较早，有些函数可能过时了，但是总体思路是不错滴，供参考。&lt;/strong>&lt;/span>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;span>&lt;strong>&lt;span>1、字符串有整型的相互转换&lt;/span>&lt;/strong>&lt;/span>&lt;/p>&lt;pre>&lt;code class="">String a = String.valueOf(&lt;span class="">2&lt;/span>); &amp;nbsp; &lt;span class="">//integer to numeric string&lt;br>&lt;/span>&lt;span class="">int&lt;/span> i = Integer.parseInt(a); &lt;span class="">//numeric string to an int&lt;/span>&lt;/code>&lt;/pre>&lt;p>&lt;span>&lt;strong>&lt;span>2、向文件末尾添加内容&lt;/span>&lt;/strong>&lt;/span>&lt;br>&lt;/p>&lt;p>&lt;span>&lt;/span>&lt;/p>&lt;pre>&lt;code class="">BufferedWriter out = &lt;span class="">null&lt;/span>; &amp;nbsp; &amp;nbsp; &lt;span class="">try&lt;/span> { &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;out = &lt;span class="">new&lt;/span> BufferedWriter(&lt;span class="">new&lt;/span> FileWriter(”filename”, &lt;span class="">true&lt;/span>)); &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;out.write(”aString”); &amp;nbsp; &amp;nbsp; } &lt;span class="">catch&lt;/span> (IOException e) { &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="">// error processing code &amp;nbsp; &amp;nbsp; &lt;br>&lt;/span>} &lt;span class="">finally&lt;/span> { &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="">if&lt;/span> (out != &lt;span class="">null&lt;/span>) { &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;out.close(); &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;} &amp;nbsp; &amp;nbsp; }&lt;/code>&lt;/pre>&lt;p>&lt;span>&lt;strong>&lt;span>3、得到当前方法的名字&lt;/span>&lt;/strong>&lt;/span>&lt;/p></description></item></channel></rss>