线程

1、线程的生命周期

 

 

 

 2、线程的安全问题

因为线程在执行时,有随机性,CPU的执行权随时有可能被抢走。

解决方法:把操作共享的代码锁起来

 

3、同步代码块

把操作共享的代码锁起来

 格式:

synchronized(锁){

操作共享数据的代码

}

特点1:锁默认打开,有一个线程进去了,锁自动关闭

特点2:里面的代码全部执行完毕,线程出来,锁自动打开

注意:锁对象一定要是唯一的,所以在定义的锁对象前加一个static静态关键字。

e.g  static Object obj = new Object();

也可以直接把 当前类名.class作为锁对象,因为当前类名.class也是唯一的

 

4、同步方法

就是把synchronized关键字加到方法上,把方法的全部代码锁起来。

格式:

修饰符 synchronized 返回值类型 方法名(方法参数){...}

特点1:同步方法是锁住方法里面所有的代码

特点2:锁对象不能自己指定(非静态:this;静态:当前类的字节码文件对象)

补充:

将StringBuildder的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用StringBuffer。因为StringBuffer的方法是同步方法,而StringBuilder不是。

 

5、Lock锁

 

 Lock lock = new ReentrantLock();

//加锁

lock.lock();

//释放锁

lock.unlock();

 

6、死锁

出现情景:有锁嵌套、

所以,我们在写锁的时候不要让两个锁嵌套起来。

posted @ 2023-03-27 18:58  Linqylin  阅读(8)  评论(0编辑  收藏  举报