公建设计网站唐山营销型网站制作

当前位置: 首页 > news >正文

公建设计网站,唐山营销型网站制作,杭州企业网站制作哪个好,我的网站为什么打不开怎么回事1、聊一下并行和并发有什么区别#xff1f; 并发是同一时间应对多件事情的能力#xff0c;多个线程轮流使用一个或多个CPU 并行是同一时间动手做多件事情的能力#xff0c;4核CPU同时执行4个线程 2、说一下线程和进程的区别#xff1f; 进程是正在运行程序的实例#xff…1、聊一下并行和并发有什么区别 并发是同一时间应对多件事情的能力多个线程轮流使用一个或多个CPU 并行是同一时间动手做多件事情的能力4核CPU同时执行4个线程 2、说一下线程和进程的区别 进程是正在运行程序的实例进程中包含了线程每个线程执行不同的任务 不同的进程使用不同的内存空间在当前进程下的所有线程可以共享内存空间 3、如果在java中创建线程有哪些方式 在java中一共有四种常见的创建方式分别是继承Thread类、实现 runnable接口、实现Callable接口、线程池创建线程。通常情况下项目 中都会采用线程池的方式创建线程。 4、runnable 和 callable 两个接口创建线程有什么不 同呢 Runnable 接口run方法无返回值Callable接口call方法有返回值是个泛 型和Future、FutureTask配合可以用来获取异步执行的结果调用FutureTask.get()得到可以得到返回值此方法会阻塞主进程的继续 往下执行如果不调用不会阻塞。 5、线程包括哪些状态状态之间是如何变化的 在JDK中的Thread类中的枚举State里面定义了6中线程的状态分别是新 建、可运行、终结、阻塞、等待和有时限等待六种。 6、线程中的 wait 和 sleep方法有什么不同呢 第一方法归属不同 sleep(long) 是 Thread 的静态方法。而 wait()是 Object 的成员方法每个对象都有 第二线程醒来时机不同 线程执行 sleep(long) 会在等待相应毫秒后醒来而 wait() 需要被 notify 唤醒wait() 如果不唤醒就一直等下去 第三锁特性不同 wait 方法的调用必须先获取 wait 对象的锁而 sleep 则无此限制 wait 方法执行后会释放对象锁允许其它线程获得该对象锁相当于我放弃cpu但你们还可以用而 sleep 如果在 synchronized 代码块中执行并不会释放对象锁相当于我放弃 cpu你们也用不了 7、如何停止一个正在运行的线程呢 第一可以使用退出标志使线程正常退出也就是当run方法完成后线程终止一般我们加一个标记 这个标记得用volitale变量修饰 第二可以使用线程的stop方法强行终止不过一般不推荐这个方法已作废 第三可以使用线程的interrupt方法中断线程内部其实也是使用中断标志来中断线程 8、讲一下synchronized关键字的底层原理 synchronized 底层使用的JVM级别中的Monitor 来决定当前线程是否获得了锁如果某一个线程获得了锁在没有释放锁之前其他线程是不能或得到锁的。synchronized 属于悲观锁。synchronized 因为需要依赖于JVM级别的Monitor 相对性能也比较低。 9、能具体说下Monitor 吗 monitor对象存在于每个Java对象的对象头中synchronized 锁便是通过这种方式获取锁的也是为什么Java中任意对象可以作为锁的原因monitor内部维护了三个变量 WaitSet保存处于Waiting状态的线程 EntryList保存处于Blocked状态的线程 Owner持有锁的线程 只有一个线程获取到的标志就是在monitor中设置成功了Owner一个 monitor中只能有一个Owner在上锁的过程中如果有其他线程也来抢锁则进入EntryList 进行阻塞当获得锁的线程执行完了释放了锁就会唤醒EntryList 中等待的线程竞争锁竞争的时候是非公平的。 10、关于synchronized 的锁升级的情况了解吗 Java中的synchronized有偏向锁、轻量级锁、重量级锁三种形式分别对应了锁只被一个线程持有、不同线程交替持有锁、多线程竞争锁三种情况。 重量级锁底层使用的Monitor实现里面涉及到了用户态和内核态的切 换、进程的上下文切换成本较高性能比较低。 轻量级锁线程加锁的时间是错开的也就是没有竞争可以使用轻量级锁来优化。轻量级修改了对象头的锁标志相对重量级锁性能提升很多。每次修改都是CAS操作保证原子性 偏向锁一段很长的时间内都只被一个线程使用锁可以使用了偏向锁在第一次获得锁时会有一个CAS操作之后该线程再获取锁只需要判断mark word中是否是自己的线程id即可而不是开销相对较大的CAS命令一旦锁发生了竞争都会升级为重量级锁 11、在高并发情况下该如何控制使用锁呢 可以采用ReentrantLock来加锁。 ReentrantLock是一个可重入锁:调用 lock 方 法获取了锁之后再次调用lock是不会再阻塞内部直接增加重入次数 就行了标识这个线程已经重复获取一把锁而不需要等待锁的释放。 ReentrantLock是属于juc报下的类属于api层面的锁跟synchronized一样都是悲观锁。通过lock()用来获取锁unlock()释放锁。它的底层实现原理主要利用CASAQS队列来实现。它支持公平锁和非公平锁两者的实现类似构造方法接受一个可选的公平参数默认非公平锁当设置为true时表示公平锁否则为非公平锁。公平锁的效率往往没有非公平锁的效率高。 12、CAS和AQS你能介绍一下吗 CAS的全称是 Compare And Swap(比较再交换);它体现的一种乐观锁的思想在无锁状态下保证线程操作数据的原子性。 CAS使用到的地方很多AQS框架、AtomicXXX类 在操作共享变量的时候使用的自旋锁效率上更高一些CAS的底层是调用的Unsafe类中的方法都是操作系统提供的其他语言实现 AQS的话其实就一个jdk提供的类AbstractQueuedSynchronizer是阻塞式锁和相关的同步器工具的框架。内部有一个属性 state 属性来表示资源的状态默认state等于0表示没有获取锁state等于1的时候才标明获取到了锁。通过cas 机制设置 state 状态在它的内部还提供了基于 FIFO 的等待队列是一个双向列表其中tail 指向队列最后一个元素head 指向队列中最久的一个元素。 13、synchronized和Lock有什么区别 ? 第一语法层面 synchronized 是关键字源码在 jvm 中用 c 语言实现退出同步代码块锁会自动释放 Lock 是接口源码由 jdk 提供用 java 语言实现需要手动调用 unlock 方法释放锁 第二功能层面 二者均属于悲观锁、都具备基本的互斥、同步、锁重入功能Lock 提供了许多 synchronized 不具备的功能例如获取等待状态、公平锁、可打断、可超时、多条件变量同时Lock 可以实现不同的场景如ReentrantLockReentrantReadWriteLock 第三性能层面 在没有竞争时synchronized 做了很多优化如偏向锁、轻量级锁性能不赖在竞争激烈时Lock 的实现通常会提供更好的性能统合来看需要根据不同的场景来选择不同的锁的使用。 14、死锁产生的条件是什么 t1 线程获得A对象锁接下来想获取B对象的锁 t2 线程获得B对象锁接下来想获取A对象的锁 这个时候t1线程和t2线程都在互相等待对方的锁就产生了死锁 15、如何进行死锁诊断 先通过jps来查看当前java程序运行的进程id 然后通过jstack来查看这个进程id就能展示出来死锁的问题并且可以定位代码的具体行号范围我们再去找到对应的代码进行排查就行了。 16、谈谈你对 volatile 的理解 volatile 是一个关键字可以修饰类的成员变量、类的静态成员变量主要有两个功能 第一保证了不同线程对这个变量进行操作时的可见性即一个线程修改了某个变量的值这新值对其他线程来说是立即可见的,volatile关键字会强制将修改的值立即写入主存。 第二 禁止进行指令重排序可以保证代码执行有序性。底层实现原理是添加了一个内存屏障通过插入内存屏障禁止在内存屏障前后的指令执行重排序优化 17、线程池的种类有哪些 在jdk中默认提供了4中方式创建线程池 第一个是newCachedThreadPool创建一个可缓存线程池如果线程池长度超过处理需要可灵活回 收空闲线程若无可回收则新建线程。 第二个是newFixedThreadPool 创建一个定长线程池可控制线程最大并发数超出的线程会在队列 中等待。 第三个是newScheduledThreadPool 创建一个定长线程池支持定时及周期性任务执行。 第四个是newSingleThreadExecutor 创建一个单线程化的线程池它只会 用唯一的工作线程来执行任 务保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。 18、线程池的核心参数有哪些 在线程池中一共有7个核心参数 corePoolSize 核心线程数目 - 池中会保留的最多线程数maximumPoolSize 最大线程数目 - 核心线程救急线程的最大数目keepAliveTime 生存时间 - 救急线程的生存时间生存时间内没有新任务此线程资源会释放unit 时间单位 - 救急线程的生存时间单位如秒、毫秒等workQueue - 当没有空闲核心线程时新来任务会加入到此队列排队队列满会创建救急线程执行任务threadFactory 线程工厂 - 可以定制线程对象的创建例如设置线程名字、是否是守护线程等handler 拒绝策略 - 当所有线程都在繁忙workQueue 也放满时会触发拒绝策略在拒绝策略中又有4种拒绝策略当线程数过多以后第一种是抛异常、第二种是由调用者执行任务、第三是丢弃当前的任务第四是丢弃最早排队任务。默认是直接抛异常。 19、如何确定核心线程池呢 IO密集型任务推荐核心线程数大小设置为2N1 N为计算机的CPU核数 CPU密集型任务推荐核心线程数大小设置为N1 N为计算机的CPU核数 20、为什么不建议使用Executors创建线程池呢 主要原因是如果使用Executors创建线程池的话它允许的请求队列默认长度是Integer.MAX_VALUE这样的话有可能导致堆积大量的请求从而导致OOM内存溢出。 21、如果控制某一个方法允许并发访问线程的数量 在jdk中提供了一个Semaphore类信号量它提供了两个方法semaphore.acquire() 请求信号量可以限制线程的个数是一个正数如果信号量是-1,就代表已经用完了信号量其他线程需要阻塞了 第二个方法是semaphore.release()代表是释放一个信号量此时信号量的个数1 22、如何保证Java程序在多线程的情况下执行安全呢 如果解决的话jdk中也提供了很多的类帮助我们解决多线程安全的问题比如 JDK Atomic开头的原子类、synchronized、LOCK可以解决原子性问题 synchronized、volatile、LOCK可以解决可见性问题 Happens-Before 规则可以解决有序性问题 23、谈谈你对ThreadLocal的理解 ThreadLocal 主要功能有两个第一个是可以实现资源对象的线程隔离让每个线程各用各的资源对象避免争用引发的线程安全问题第二个是实现了线程内的资源共享 24、ThreadLocal的底层原理实现了解吗 在ThreadLocal内部维护了一个一个 ThreadLocalMap 类型的成员变量用来存储资源对象 当我们调用 set 方法就是以 ThreadLocal 自己作为 key资源对象作为value放入当前线程的 ThreadLocalMap 集合中 当调用 get 方法就是以 ThreadLocal 自己作为 key到当前线程中查找关联的资源值 当调用 remove 方法就是以 ThreadLocal 自己作为 key移除当前线程关联的资源值