-
线程的创建方式
- 继承Thread类
- 实现Runnable接口
-
为什么需要定一个类去实现Runnable接口呢?继承Thread类和实现Runnable接口有啥区别呢?
实现Runnable接口,避免了继承Thread类的单继承局限性。覆盖Runnable接口中的run方法,将线程任务代码定义到run方法中。创建Thread类的对象,只有创建Thread类的对象才可以创建线程。线程任务已被封装到Runnable接口的run方法中,而这个run方法所属于Runnable接口的子类对象,所以将这个子类对象作为参数传递给Thread的构造函数,这样,线程对象创建时就可以明确要运行的线程的任务。
实现Runnable的好处
第二种方式实现Runnable接口避免了单继承的局限性,所以较为常用。实现Runnable接口的方式,更加的符合面向对象,线程分为两部分,一部分线程对象,一部分线程任务。继承Thread类,线程对象和线程任务耦合在一起。一旦创建Thread类的子类对象,既是线程对象,有又有线程任务。实现runnable接口,将线程任务单独分离出来封装成对象,类型就是Runnable接口类型。Runnable接口对线程对象和线程任务进行解耦。
- synchronized关键字和volatile关键字的区别
synchronized关键字和volatile关键字的比较
volatile关键字是线程同步轻量级的实现,所以volatile性能肯定比synchronized关键字摇号。但是volatile关键字只能适用于变量,而synchronized关键字可以修饰方法以及代码块。synchronized关键字在JavaSE1.6之后主要包括为了减少获得锁和释放锁带来的性能小号而引入的偏向锁和轻量锁以及各种优化之后执行效率显著提升,实际开发中使用synchronized关键字的场景还是更多一些。
多线程访问volatile关键字不会发生阻塞,二synchronized关键字可能会发生阻塞
volatile关键字能保证数据的可见性,但是不能保证数据的原子性。synchronized关键字两者都能保证。
volatile关键字主要用于解决变量在多个线程之间的可见性,二synchronized关键字解决的是多个线程之间的访问资源的同步性。