首页 > 编程语言 >Java学习笔记(十七)

Java学习笔记(十七)

时间:2023-06-26 11:57:58浏览次数:43  
标签:十七 Java synchronized 对象 笔记 Mythread 线程 静态方法 方法

1、手写一个懒汉式的单例模式&解决其线程安全问题,并且说明为什么这样子去解决

class Mythread extends Thread{
   
    private static Mythread mythread;
   
    private Mythread() {
    }
    public static Mythread getInstance() throws InterruptedException {
        synchronized (Mythread.class){
            if (mythread == null){
                mythread = new Mythread();
            }
            return mythread;
        }
    }
}

在获取对象时加锁,使得在获取对象时,线程资源不被抢走。从而避免创建多个对象的情况。

2、wait()和sleep()有什么区别?调用这两个函数后,线程状态分别作何改变?

(1)wait()方法是用于线程之间进行通信的,而sleep()方法是用于暂停程序执行的。

(2)在调用wait()方法后,线程会释放它所持有的对象锁,而sleep()方法不会释放任何锁或资源。

(3)wait()方法需要在同步块中调用,而sleep()方法可以在任何地方调用。

3、Java中notify()和notifyAll()有什么区别

多个线程等待同一个对象锁,且notify()方法只随机唤醒其中的一个线程,可能导致其他线程仍然处于等待状态,从而出现竞争条件。

4、为什么wait()和notify()方法要在同步块中调用

它们需要获取对象的锁才能执行

5、 什么是死锁,产生死锁的原因及必要条件

死锁是指两个或多个线程在互相等待对方释放锁时,都无法继续执行,从而导致程序无法正常运行的一种并发问题。

  1. 互斥条件:一个资源只能被一个线程占用,其他线程必须等待该资源释放后才能占用。
  2. 请求和保持条件:一个线程可以持有一个资源,并继续请求其他资源,而这些资源可能被其他线程占用,并且其他线程不会释放这些资源,从而导致线程等待。
  3. 不剥夺条件:线程已经获得的资源不能被其他线程剥夺,只能由持有该资源的线程自行释放。
  4. 循环等待条件:存在一个线程的等待链,使得这个等待链中的每个线程都在等待下一个线程所持有的资源。

6、 多线程共用一个数据变量需要注意什么?

线程安全问题:由于多个线程同时访问同一个数据变量,可能会出现并发问题,例如数据竞争、死锁、数据不一致等。因此,需要采取相应的措施来保证线程安全,例如使用同步机制、使用线程安全的数据结构等。

7、synchronized加在静态方法和普通方法区别?

  1. 锁对象不同:对于普通方法,锁对象是当前对象实例(即this),而对于静态方法,锁对象是当前类的Class对象。
  2. 影响范围不同:对于普通方法,synchronized关键字只对当前对象实例中的synchronized方法或代码块起作用,而对于静态方法,synchronized关键字作用于整个类的所有实例。
  3. 性能影响不同:由于锁对象不同,synchronized修饰静态方法的性能开销可能会比修饰普通方法更大,因为需要获取类级别的锁。而修饰普通方法的锁对象是当前对象实例,相对来说更容易获取。
互斥范围不同:由于锁对象不同,synchronized修饰静态方法和修饰普通方法时,互斥的范围也不同。对于静态方法,互斥的范围是整个类的所有实例,而对于普通方法,互斥的范围只是当前对象实例的所有synchronized方法或代码块。

标签:十七,Java,synchronized,对象,笔记,Mythread,线程,静态方法,方法
From: https://www.cnblogs.com/wgh123/p/17505249.html

相关文章

  • 代码随想录算法训练营第十七天| 654.最大二叉树 617.合并二叉树 700.二叉搜索树中
     654.最大二叉树 比较简单,直接上代码1TreeNode*constructMax_cursor(vector<int>&nums)2{3if(nums.size()==0)returnNULL;4//getMaxNum5intindex=0;6intmax_=INT_MIN;7for(inti=0;i<nums.size();i++)8......
  • 【个人笔记】免费可用中文版ChatGPT,国内免费版ChatGPT
    ChatGPT介绍ChatGPT是个啥?Openai团队研发的一个人工智能聊天程序。Chat:表示“聊天”。GPT:则是Generative、Pre-trained、Transformer的缩写,表示“预训练语言模型”,可以理解成一个“会说话”的人工智能。即:可以对话的人工智能,你问他什么他都可以回答。 为什么那么多免费C......
  • java 8新特性 list转map
    List<Object> 转Map<String,List<String>>Map<String,List<String>>skillAndList=list.stream().collect(Collectors.groupingBy(Employee::getSkillId,Collectors.mapping(Employee::getStudent,Collectors.toList())));List<Obje......
  • java陷阱之数据库主从
    现象客户遇到工单缺少描述,查询日志写入描述报错,但那是工单又正常生产  原因先写入工单再查询工单实时性要求比较高的不能走从库,还有就是service层方法命名不规范,不点进去看根本不知道走从库,如果要走从库应该带上Slave后缀,查询缓存也一样带上cachefindProviderIdB......
  • java实际开发中接口文档是自己写还是架构师写?
    软件工程的两种方法下,由后端决定接口都是不对的。第一种软件工程的方法:瀑布模型,自顶而下,逐步细化。接口会变,但是接口要提前设计。接口不是后端开发完成之后才“自然”产生的,那不是自然,而是无序。前后端分离的开发,应该是面向“API”的开发。API的设计并不能由前端或后端一方决定......
  • JavaScript program to check if a given year is leap year Javascript判断是否是闰
    Ayearisleapyeariffollowingconditionsaresatisfied:Yearismultipleof400.Yearismultipleof4andnotmultipleof100.Approach: Getthevalueofinputfieldbyusingdocument.getElementById(“year”).valueCheckthegivenyearisleapyear......
  • Python工具箱系列(三十七)
    二进制文件操作(上)python比较擅长与文本相关的操作。但现实世界中,对于非文本消息的处理也很普遍。例如:◆通过有线、无线传递传感器获得的测量数据。◆卫星通过电磁波发送测量数据。◆数据中心的数万台服务器发送当前CPU的占用率信息、内存占用量等众多指标数据。以上数据,当然......
  • java反射之-InvocationHandler使用
    InvocationHandler是Java中的一个接口,是Java反射API的一部分。与Proxy类一起使用,用于动态创建接口的代理实例。在Java中使用Proxy类创建代理对象时,需要提供一个InvocationHandler实现来定义代理对象的行为。InvocationHandler接口只有一个方法,即invoke()方法,它......
  • 《编写高质量代码》读书笔记系列开篇
    前言:   时间过的好快,进入这个互联网的fe行业已经快*年了,读书还是一个需要坚持的东东,是一种坚持,因为兴趣所以热爱。 正文:   其实这边书一种在间断地看着,今天组里买了一本,决定开一个系列,静静地品一下,重新审视自己的深度和方向。   1、如何做的更好的Web前端工程师?   ......
  • JavaScript1.8.5新特性系列Object.keys
    以前在js-object这个分类里面也写过keys相关的api 在JavaScript1.8.5中,加入了原生的Object.keys这个api  Object.keys(obj);/*简单举例*/Object.keys({"A":"a","B":"b"});//["A","B"]兼容性写法:  if(!Object.keys){Object.keys=......