创建线程有几种不同的方式
四种方式:
1、继承Thread类
2、实现Runnable接口
3、实现Callable接口,结合FutrueTask使用
4、利用该线程池ExecutorService、Callable、Future来实现
同步方法和同步代码块的区别是什么?
相同点:
同步方法就是在方法前加关键字synchronized,然后被同步的方法一次只能有一个线程进入,其他线程等待。而同步代码块则是在方法内部使用大括号使得一个代码块得到同步。同步代码块会有一个同步的“目标”,使得同步块更加灵活一些(同步代码块可以用过“目标”决定需要锁定的对象)。一般情况下,如果此“目标”为this,同步方法和同步代码块没有太大的区别。
区别:
同步方法直接在方法上加synchronized实现加锁,同步代码块则在方法内部加锁。很明显,同步方法锁的范围比较大,而同步代码块范围要小一点。一般同步的范围越大,性能就越差。所以一般需要加锁进行同步的时候,范围越小越好,这样性能最佳。
ArrayList和LinkedList的区别是什么?
1、数据结构不同
ArrayList是Array(动态数组)的数据结构,LinkedList是Link(链表)的数据结构
2、效率不同
ArrayList的随机访问(查询)效率高,插入和删除效率低,LinkedList的查询效率低,而删除和插入效率高,因为不需要移动元素。
3、自由性不同
ArrayList自由性比较低,因为它需要手动设置固定大小的容量,但是它的使用比较方便,只需要创建,然后添加元素,同通过调用下标进行使用,而LinkedList自由性较高,能够随数据量的变化而变化,但是它不便于使用。
BIO、NIO、AIO有什么区别?
BIO,NIO和AIO是Java网络编程的三种模型
BIO:同步并阻塞,服务实现模式为一个连接对应一个线程,即客户端发送一个连接,服务端要有一个线程来处理。如果连接多了,线程数量不够,就只能等待,即会发生阻塞。
NIO:同步非阻塞,服务实现模式是一个线程可以处理多个连接,即客户端发送的连接都会注册到多路复用器上,然后进行轮询连接,有I/O请求就处理
AIO:异步非阻塞,引入了异步通道,采用的是proactor模式,特点是:有效的请求才启动线程,先有操作系统完成在通知服务端
应用场景:
BIO:适用连接数目比较小且固定的架构,对服务器要求比较高,并发局限于应用中
NIO:适用连接数目多且连接比较短的架构,如:聊天服务器,弹幕系统等,编程比较复杂
AIO:适用连接数目多且连接长的架构,如相册服务器
BIO和NIO的区别
BIO主要是以I/O流的形式处理数据;NIO以I/O块(buffer)的形式处理数据,效率:块>流
BIO是阻塞的,NIO是非阻塞的
BIO主要是以字节流和字符流操作,NIO是基于channel(通道)、buffer(缓冲区)操作的;selector(选择器)是用来监听channel的
BIO是单向的,要么是输入流要么是输出流,NIO是双向的,可以从channel往buffer读写数据,同时buffer也可以向channel读写数据
synchronized和volatile的区别是什么?
1、volatile仅能使用在变量级别;synchronized则可以使用在变量、方法和类级别的
2、volatile仅能实现变量的修改可见性,并不能保证原子性;synchronized则可以保证变量的修改可见性和原子性
3、volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞
4、volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化