1、多线程中的i++线程安全吗?为什么?

不安全,因为每个线程都有自己的工作内存,每个线程需要对共享变量操作时必须把共享变量从主内存中加载到自己的工作内存,等完成操作后再保存到内存中,如果一个线程运算完成后还没刷新到主内存中,另一个线程又对这个共享变量进行操作,那么读取到的数据就是脏数据了。

2、如何线程安全的实现一个计数器?

可以使用Sychronized关键字对计数器方法加锁,或者直接使用支持原子性操作的类AtomicInteger。

3、多线程同步的方法

  1. 同步方法:即有synchronized关键字修饰的方法。 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时,内置锁会保护整个方法,在调用该方法前,需要获得内置锁,否则就处于阻塞状态。
  2. 同步代码块:即有synchronized关键字修饰的语句块。被该关键字修饰的语句块会自动被加上内置锁,从而实现同步。
  3. 使用特殊域变量(volatile)实现线程同步:

    (1) volatile关键字为域变量的访问提供了一种免锁机制;

    (2) 使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新;

    (3) 因此每次使用该域就要重新计算,而不是使用寄存器中的值;

    (4) volatile不会提供任何原子操作,它也不能用来修饰final类型的变量。

  4. 使用重入锁实现线程同步:在JavaSE5.0中新增了一个java.util.concurrent包来支持同步。ReentrantLock类是可重入、互斥、实现了Lock接口的锁, 它与使用了synchronized的方法和块具有相同的基本行为和语义,并且扩展了其能力。ReenreantLock类的常用方法有,ReentrantLock() :创建一个ReentrantLock实例;lock() :获得锁;unlock() :释放锁。
  5. 本地线程存储实现线程同步(ThreadLocal):如果使用ThreadLocal管理变量,则每一个使用该变量的线程都获得该变量的副本,副本之间相互独立,这样每一个线程都可以随意修改自己的变量副本,而不会对其他线程产生影响。

4、介绍一下生产者消费者模式?

5、线程,进程,然后线程创建有很大开销,怎么优化?

进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程;进程在执行过程中拥有独立的内存单元,而多个线程共享内存资源,减少切换次数,从而效率更高;线程是进程的一个实体,是cpu调度的基本单位;同一进程中的多个线程之间可以并发执行。

使用线程池可以避免频繁地创建和销毁线程产生的过大开销,以达到线程对象的重用,还可以根据项目灵活地控制并发数目。

6、线程池运行流程,参数,策略。

当提交一个新任务到线程池时,线程池的运行流程如下:

  1. 判断核心线程池(corePoolSize)是否已满,没满,则创建一个工作线程来执行任务,满了,则进入2流程;
  2. 判断工作队列(workQueue)是否已满,没满,则将新提交的任务存储在工作队列里,满了,则进入3流程;
  3. 判断整个线程池的线程数是否已超过maximumPoolSize,没满,则创建一个新的工作线程来执行任务,满了,则交给拒绝策略来处理这个任务。

线程池主要参数:

  1. corePoolSize:核心线程池数量(线程池维护线程的最少数量)
  2. maximumPoolSize:线程池维护线程的最大数量
  3. keepAliveTime:线程池维护线程所允许的空闲时间
  4. unit:线程池维护线程所允许的空闲时间的单位
  5. workQueue:线程池所使用的缓冲队列(工作队列)
  6. threadFactory:线程创建的工厂
  7. handler:线程池对拒绝任务的处理策略

线程池的拒绝策略:

  1. AbortPolicy:丢弃任务,并抛出异常;
  2. DiscardPolicy:不能执行的任务将被丢弃;
  3. DiscardOldestPolicy:如果执行程序尚未关闭,则位于工作队列头部的任务将被删除,然后重试该执行程序;该策略稍微复杂一些,在pool没有关闭的前提下首先丢掉缓存在队列中的最早的任务,然后重新尝试运行该任务;
  4. CallerRunsPolicy:线程调用运行该任务的 execute 本身,这个策略不想放弃执行任务。但是由于池中已经没有任何资源了,那么就直接使用调用该execute的线程本身来执行。

7、讲一下AQS吧。

JavaSE_5_线程的更多相关文章

  1. [ 高并发]Java高并发编程系列第二篇--线程同步

    高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...

  2. [高并发]Java高并发编程系列开山篇--线程实现

    Java是最早开始有并发的语言之一,再过去传统多任务的模式下,人们发现很难解决一些更为复杂的问题,这个时候我们就有了并发. 引用 多线程比多任务更加有挑战.多线程是在同一个程序内部并行执行,因此会对相 ...

  3. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

  4. Java 线程

    线程:线程是进程的组成部分,一个进程可以拥有多个线程,而一个线程必须拥有一个父进程.线程可以拥有自己的堆栈,自己的程序计数器和自己的局部变量,但不能拥有系统资源.它与父进程的其他线程共享该进程的所有资 ...

  5. C++实现线程安全的单例模式

    在某些应用环境下面,一个类只允许有一个实例,这就是著名的单例模式.单例模式分为懒汉模式,跟饿汉模式两种. 首先给出饿汉模式的实现 template <class T> class sing ...

  6. 记一次tomcat线程创建异常调优:unable to create new native thread

    测试在进行一次性能测试的时候发现并发300个请求时出现了下面的异常: HTTP Status 500 - Handler processing failed; nested exception is ...

  7. Android线程管理之ThreadLocal理解及应用场景

    前言: 最近在学习总结Android的动画效果,当学到Android属性动画的时候大致看了下源代码,里面的AnimationHandler存取使用了ThreadLocal,激起了我很大的好奇心以及兴趣 ...

  8. C#多线程之线程池篇3

    在上一篇C#多线程之线程池篇2中,我们主要学习了线程池和并行度以及如何实现取消选项的相关知识.在这一篇中,我们主要学习如何使用等待句柄和超时.使用计时器和使用BackgroundWorker组件的相关 ...

  9. C#多线程之线程池篇2

    在上一篇C#多线程之线程池篇1中,我们主要学习了如何在线程池中调用委托以及如何在线程池中执行异步操作,在这篇中,我们将学习线程池和并行度.实现取消选项的相关知识. 三.线程池和并行度 在这一小节中,我 ...

随机推荐

  1. 关于Android进程的启动和消亡

    在打开一个应用程序的时候,packagemanager会根据manifest文件去查找有没有相应的进程已启动,若果没有启动,那么就启动一个新的进程 进程退出有两种方式,用finish结束主activi ...

  2. spring 4.0 注解数据验证2

    在spring 4.0 注解数据验证1中有基本的数据验证方法.还是那个POJO: package com.suyin.pojo; import java.lang.reflect.Field; imp ...

  3. 实现hadoop中的机架感知

    hadoop中声明是有机架感知的功能,能够提高hadoop的性能.平时我们使用的hadoop集群,实际上是从来没有使用上这个功能的. hadoop中所说的 机架感知的实现实际上这样的: hadoop启 ...

  4. 6、perl创建模块(Exporter)及路径 引用 嵌套 查询模块

    参考博客:http://www.cnblogs.com/xudongliang/tag/perl/ 1.perl 模块的创建以及制定perl 模块的路径 (1)创建一个Myfun.pm模块. #/us ...

  5. Java基础——java中String、StringBuffer、StringBuilder的区别

    (转自:http://www.cnblogs.com/xudong-bupt/p/3961159.html) java中String.StringBuffer.StringBuilder是编程中经常使 ...

  6. Http客户端再封装

    Android系统上推荐的Http客户端从Apache变成[HttpURLConnection],主要理由包括 * 不过因为UrlConnection这组接口时间较早(Java 1.0), 接口的设计 ...

  7. 自签名配置HTTPS

    基于AFN3.0 1.将后台提供的.cer文件文件保存至本地 2.在封装的网络请求工具类中为AFN的AFSecurityPolicy属性赋值 -(AFSecurityPolicy *)customSe ...

  8. Note: Improving Restore Speed for Backup Systems that Use Inline Chunk-Based Deduplication

    思路/方法 Measuring restore speed 提出了speed-factor,用以衡量存储速度. Container capping 限制恢复文件时使用的container个数,为了保证 ...

  9. kolla制作过程中:neutron-sfc-agent 报错的问题

    在使用二进制方式编译镜像的时候,neutron的sfc-agent提示如下错误ERROR:kolla.image.build:neutron-sfc-agent Failed with status: ...

  10. CodeForces 137C【贪心+优先队列】

    这种区间的贪心好像都出"烂"了? 不过还是想写一下... 先按照区间左端点排序一下,然后搞个优先队列维护当前最小的右端点. #include <bits/stdc++.h&g ...