1.多线程的实现有几种方式?实现步骤分别是怎样的?
继承Thread类,然后重写run方法,然后使用start方法.
实现runnable接口,
2.继承Thread类和实现Runnable接口有啥区别?实现Runnable接口的优势体现在哪里?
1.将线程任务和线程对象分离,进行解耦。可以实现多个线程共享同一资源
2.不占用继承位
3.线程安全问题时怎么产生的?如何解决线程安全问题,有哪几种方式?
当多线程操作同一资源,并执行写操作的时候,会发生线程不同步引发的问题
1.同步代码块
- - 把多条语句操作共享数据的代码给锁起来,让任意时刻只能有一个线程执行即可
- Java提供了同步代码块的方式来解决
- 同步代码块格式:
synchronized(任意对象) {
多条语句操作共享数据的代码
}
synchronized(任意对象):就相当于给代码加锁了,任意对象就可以看成是一把锁
2.同步方法
- 同步方法的格式
同步方法:就是把synchronized关键字加到方法上
修饰符 synchronized 返回值类型 方法名(方法参数) {
方法体;
}
同步方法的锁对象是什么呢?
this
- 静态同步方法
同步静态方法:就是把synchronized关键字加到静态方法上
修饰符 static synchronized 返回值类型 方法名(方法参数) {
方法体;
}
3.lock锁
- ReentrantLock构造方法创建lock锁实例
方法名 说明
ReentrantLock() 创建一个ReentrantLock的实例
- 加锁解锁方法
方法名 说明
void lock() 获得锁
void unlock() 释放锁
4.sleep()方法和wait()方法的区别?
sleep和wait都是线程阻塞方法,sleep是Thread类的方法,wait是Object类的方法。
sleep调用之后会放弃CPU执行权,但是不会放弃锁对象;Wait CPU执行权和锁对象都放弃
sleep方法到了时间自动苏醒,去抢夺CPU;wait方法没有线程唤醒不会自己醒
|