我的 BAT 梦~3

J2SE基础~3

开心一刻:今天公司让我接待,新入职的女孩,我看着她的简历,边走边聊:你今年本命年!女孩惊悚的望着我,并用手护住屁股说:你看见我裤衩了? 呜呜 好邪恶~

此篇文章为了控制篇幅,多提供了几个外链~~
下面正式进入干货区,喜欢的话、双击、评论、转发,动一动你的小手让更多的人知道!关注帅比~杨

  1. 实现多线程的两种方法:Thread与Runable。

  2. 线程同步的方法:sychronized、lock、reentrantLock等。

  3. 锁的等级:方法锁、对象锁、类锁。

  4. 写出生产者消费者模式。

  5. ThreadLocal的设计理念与作用。

  6. ThreadPool用法与优势。

  7. Concurrent包里的其他东西:ArrayBlockingQueue、CountDownLatch等等。

  8. wait()和sleep()的区别。

  9. foreach与正常for循环效率对比。

  10. Java IO与NIO。

  11. 反射的作用与原理。

  12. 泛型常用特点,List能否转为List。

  13. 解析XML的几种方式的原理与特点:DOM、SAX、PULL。

  14. Java与C++对比。

  15. Java1.7与1.8新特性。

  16. 设计模式:单例、工厂、适配器、责任链、观察者等等。

  17. JNI的使用。

1. 实现多线程的两种方法:Thread与Runable。
java实现多线程有两种方法

  1. 继承Thread类
  2. 实现Runnable接口
    **ps: ***不论用哪种方法,都必须用Thread(如果是Thead子类就用它本身)产生线程,然后再调用start()方法。

继承Thread类有一个缺点就是单继承,而实现Runnable接口则弥补了它的缺点,可以实现多继承
继承Thread类如果产生Runnable实例对象,就必须产生多个Runnable实例对象,然后再用Thread产生多个线程;而实现Runnable接口,只需要建立一个实现这个类的实例,然后用这一个实例对象产生多个线程。

2. 线程同步的方法:sychronized、lock、reentrantLock等。
synchronized可以加在方法上,也可以加在特定代码块中,括号中表示需要锁的对象。

lock:需要显示指定起始位置和终止位置。一般使用ReentrantLock类做为锁,多个线程中必须要使用一个ReentrantLock类做为对象才能保证锁的生效。且在加锁和解锁处需要通过lock()和unlock()显示指出。所以一般会在finally块中写unlock()以防死锁。
详细的使用说明请戳: https://my.oschina.net/softwarechina/blog/170859

3. 锁的等级:方法锁、对象锁、类锁。
方法锁:
通过在方法声明中加入 synchronized关键字来声明 synchronized 方法。
ps:最常见的一种方法锁形式:

    public synchronized void method() {
      System.out.println("我是对象锁也是方法锁");
  }

对象锁:
对象锁(synchronized修饰方法或代码块)当一个类中有synchronized method或synchronized block的时候调用此类的此方法或进入其同步区域时,就必须先获得对象锁。如果此类的对象锁已被其他调用者占用,则需要等待此锁被释放。(方法锁也可以是对象锁,非static修饰的函数),下面给出简单示例:

public synchronized void method1() {
    // 同步方法
    System.out.println("对象锁:方式一");
}

public void method2() {
    // 同步代码块
    synchronized (this) {
        System.out.println("对象锁:方式二");
    }
} 

类锁:(synchronized 修饰静态的方法或代码块)由于一个class不论被实例化多少次,其中的静态方法和静态变量在内存中都只有一份。所以,一旦一个静态的方法被申明为synchronized。此类所有的实例化对象在调用此方法,共用同一把锁,我们称之为类锁。简单示例:

public static synchronized void method1() {
    System.out.println("类锁:方式一");
}

public void method2() {
    synchronized (Trhead_.class) {
        System.out.println("类锁:方式二");
    }
} 

4. 写出生产者消费者模式。
很形象很用心的文章 http://www.jianshu.com/p/0d1c950e6614 但均为提供demo这里提供的只是编程思想,拒绝伸手党,提高自己的编程能力是做编程最基本的原则,所以此时此刻努力吧。淡化你的“cv"大法,关注帅比-杨~~从这里出发!

5. ThreadLocal的设计理念与作用。
ThreadLocal提供了一种解决多线程并发问题的方案。此类在维护变量时,实际使用了当前线程(Thread)中的一个叫做ThreadLocalMap的独立副本,每个线程可以独立修改属于自己的副本而不会互相影响,从而隔离了线程和线程,避免了线程访问实例变量发生冲突的问题。ThreadLocal本身并不是一个线程,而是通过操作当前线程(Thread)中的一个内部变量来达到与其他线程隔离的目的.之所以取名为ThreadLocal,所期望表达的含义是其操作的对象是线程(Thread)的一个本地变量.如果我们看一下Thread的源码实现,就会发现这一变量,代码如下:

public class Thread implements Runnable {  
    // 这里省略了许多其他的代码  
    ThreadLocal.ThreadLocalMap threadLocals = null;  
}

这是JDK中Thread源码的一部分,从中我们可以看出ThreadLocalMap跟随着当前的线程而存在.不同的线程Thread,拥有不同的ThreadLocalMap的本地实例变量,这也就是“副本”的含义
如果想了解的更详细请戳这里:http://blog.csdn.net/hua286306956/article/details/8660268

6. ThreadPool用法与优势。
ThreadPool理解过来就是线程池,合理利用线程池能够带来三个好处:
1> 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
2> 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
3> 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。
简单用法如下:

/**
 * 创建一个带有固定线程的线程池
 */
public static void displayThreadPool() {
    // 创建一个带有4个固定线程的线程池
    ExecutorService threadPool = Executors.newFixedThreadPool(4);
    distributeTaskForThreadPool(threadPool);
}
/**
 * 为线程池分配8个任务,使其驱动
 * 
 * @param threadPool
 */
public static void distributeTaskForThreadPool(ExecutorService threadPool) {
    // 让线程池驱动8个任务
    for (int i = 1; i <= 8; i++) {
        // 由于内部类里面不能放一个非final的变量,所以我把i的值赋予task
        final int task = i;

        threadPool.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println("我是" + Thread.currentThread().getName()
                        + "," + "拿到了第" + task + "个任务,我开始执行了");
            }
        });
    }
}

7. Concurrent包里的其他东西:ArrayBlockingQueue、CountDownLatch等等。
ArrayBlockingQueue: 一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。队列的头部是在队列中存在时间最长的元素。队列的尾部是在队列中存在时间最短的元素。新元素插入到队列的尾部,队列检索操作则是从队列头部开始获得元素。

CountDownLatch: 从名字可以看出,CountDownLatch是一个倒数计数的锁,当倒数到0时触发事件,也就是开锁,其他人就可以进入了。在一些应用场合中,需要等待某个条件达到要求后才能做后面的事情;同时当线程都完成后也会触发事件,以便进行后面的操作。
CountDownLatch最重要的方法是countDown()和await(),前者主要是倒数一次,后者是等待倒数到0,如果没有到达0,就只有阻塞等待了。
详情: http://blog.csdn.net/hikvision_java_gyh/article/details/9953691

8. wait()和sleep()的区别。
wait是Object类里的方法;当一个线程执行到wait()方法时,它就进入到一个和该对象相关的等待池中,同时失去(释放)了对象的机锁(暂时失去机锁,wait(long timeout)超时时间到后还需要返还对象锁);其他线程可以访问;wait()使用notify或者notifyAlll或者指定睡眠时间来唤醒当前等待池中的线程。wiat()必须放在synchronized block中,否则会在program runtime时扔出”java.lang.IllegalMonitorStateException“异常。

sleep: 使当前线程进入停滞状态(阻塞当前线程),让出CUP的使用、目的是不让当前线程独自霸占该进程所获的CPU资源,以留一定时间给其他线程执行的机会; sleep()是Thread类的Static(静态)的方法;因此他不能改变对象的机锁,所以当在一个Synchronized块中调用Sleep()方法是,线程虽然休眠了,但是对象的机锁并木有被释放,其他线程无法访问这个对象(即使睡着也持有对象锁)。在sleep()休眠时间期满后,该线程不一定会立即执行,这是因为其它线程可能正在运行而且没有被调度为放弃执行,除非此线程具有更高的优先级。

sleep()和wait()方法的最大区别是:sleep()睡眠时,保持对象锁,仍然占有该锁;而wait()睡眠时,释放对象锁。但是wait()和sleep()都可以通过interrupt()方法打断线程的暂停状态,从而使线程立刻抛出InterruptedException(但不建议使用该方法)。

9. foreach与正常for循环效率对比。
首先介绍一下:foreach语句是java5的新特征之一,是for语句的简化版本。在遍历数组、集合方面foreach为开发人员提供了极大的方便(主要体现在代码简化)。然而foreach语句并不能完全取代for语句,且任何的foreach语句都可以改写为for语句版本,这个只有亲自动过手的小伙伴才知道。 由于篇幅问题这里就不贴测试代码了,想认真研究的就打开你的电脑亲自动手敲一下运行看效果,编程是一种以动手为美的工作,你还不动手!?

通过实际动测试可以得出:循环ArrayList时,普通for循环比foreach循环花费的时间要少一点;循环LinkList时,普通for循环比foreach循环花费的时间要多很多。
当我们将循环次数提升到一百万次的时候,循环ArrayList,普通for循环还是比foreach要快一点;但是普通for循环在循环LinkList时,程序直逼卡死。

结论:需要循环数组结构的数据时,建议使用普通for循环,因为for循环采用下标访问,对于数组结构的数据来说,采用下标访问比较好。需要循环链表结构的数据时,一定不要使用普通for循环,这种做法很糟糕,数据量大的时候有可能会导致系统崩溃。

10. Java IO与NIO。
IO: IO大致可以分为本地IO(磁盘IO)和网络IO。所谓的本地IO,即本地的应用程序从磁盘里面读写数据,不涉及网络的概念;而网络IO则是发送端发送数据(写),接收端接收数据(读)。

NIO:NIO,即 Non-blocking IO,非阻塞式的IO,上面讲的IO都是阻塞式的。什么是阻塞式的?就是你如果要从磁盘上读取一个文件,在读的过程中你不能干其他事,只有等待它读取完毕,你才能干后面的事情;而非阻塞式,显然,就可以在读取文件的过程中,做别的事情。

未完待续~~~
ps: 喜欢有帮助的话: 喜欢、评论、转发,动一动你的小手让更多的人知道!关注 帅比-杨

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,295评论 18 399
  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 2,921评论 1 18
  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 2,377评论 1 15
  • 本文出自 Eddy Wiki ,转载请注明出处:http://eddy.wiki/interview-java.h...
    eddy_wiki阅读 1,903评论 0 14
  • 这个年过的,没滋没味。 越长大越孤单。不是因为内心,而是不想出去凑热闹。 对于春晚,没有期待,好几年没看了,很多时...
    默默开心阅读 834评论 7 3