精华内容
下载资源
问答
  • 线程安全与优化

    2018-03-17 16:34:36
    总结的比较深刻使得线程安全的手段:方法1:互斥同步:共享数据同一时间只能一个线程访问(或者是一些,当使用信号量的时候)sync:会同步块前后生成字节指令是可重入的,不会出现自己把自己死的情况Java的...

    学习自深入理解JVM,总结的比较深刻


    使得线程安全的手段:

    方法1:互斥同步:共享数据同一时间只能被一个线程访问(或者是一些,当使用信号量的时候)

    sync:

    会在同步块前后生成字节码指令

    是可重入的,不会出现自己把自己锁死的情况

    Java的线程是映射到操作系统的原生线程之上的

    虚拟机自身会有优化:在通知操作系统阻塞线程之前,加入一段自旋等待过程,避免频繁的切入到核心态中

     

    Reen:

    等待可中断,如果这个人用厕所用了好久,我就放弃了,忍一忍,做其他事情去了

    公平锁:可在构造方法中声明成公平锁,由此可以确保,按照申请锁的先后顺序来给到锁

    锁可以绑定多个条件:只需要多次调用newCondition()即可

     

    方法2:非阻塞同步

    乐观锁。用硬件保证多次操作的行为只通过一条处理器指令就能完成。常用指令有:

    cas

    cas引起的无聊的aba问题

    提一嘴生产者和消费者

    就是通过阻塞队列的形式,使得双方无需关注各自生产消费的能力,产品一律用容器存放。线程池的思维则更加巧妙,正常的线程池,是有核心线程,非核心线程,阻塞队列的。他把这种处理更加细化,消费者如果可以直接消费那就消费了,如果压力太大可以多开几个线程池,实在不行了,启动阻塞队列。

     

    锁优化:

    自旋锁

    频繁切换于内核态和用户态是不可取的选择。所以后面一旦有线程要请求这个锁,他不会立刻挂起,而是让线程执行一个忙循环,也就是自旋。自旋默认是开启的。默认自旋10次以后还没获得锁,就会切换内核态了。自旋现在更加智能,如果之前通过自旋成功获取过锁,就增加自旋次数。如果自旋很少成功获得锁过,自旋可能就会被关闭。

     

    锁消除:

    程序员一般不会加无意义的锁,但是有些锁会偷偷的冒出来。

    它内部等同于StringBuilder连续的append()操作,这是优化性能和内存的措施。但是StringBuilder是同步的,所以这里JVM会进行一个检测,进行一个锁的消除。

    上面代码实际如下

    JVM很快就会发现sb的动态作用域被限制在方法内部,sb的所有引用不会逃逸到其他地方,所以就会清除锁。

     

    锁粗化

    还是用上面3个连续的append举例子。先不考虑锁的清除。append内部就是sync修饰的,但是连续3个同步操作这样真的好吗?频繁的进行一个互斥和同步,哪怕优化做的再好,也会带来一个不必要的性能浪费。所以可以给这块区域整体加一个锁。

     

    轻量级锁

    偏向锁

    偏向锁倾向于认为只有一个线程会来访问他,所以当没有线程来访问他的时候,他是可偏向的。当有线程来访问时,它将会偏向这个线程。此时,这个对象就持有了偏向锁。这个线程修改对象头成为偏向锁的时候,采用CAS操作,并且把对象头中的ThreadID修改成为自己的ID。之后访问的时候,只需要比对ID就可以了。 这个锁是不会主动释放的。如果接下来访问的线程不是他偏向的那个线程了,那么这个时候就会去检查之前那个线程是否已死。如果死了,就会置对象头为无锁状态。如果没死,就马上执行那个线程的操作栈,检查这个对象的使用情况。如果对这个对象仍然是有需求的,那么锁就会升级成轻量级锁。如果用不到了,就会重新置为无锁状态。

    轻量级锁认为竞争存在,但是很轻。认为一般若干线程对于同一个锁的操作都会错开,或者稍微等待下。这个时候倾向于用自旋去解决。但是如果自旋超过一定次数或者锁正在被占用,有个线程正在自旋的时候,又有一个新的线程到来了,那么就膨胀为重量级锁。


    展开全文
  • java 面试题 总结

    2009-09-16 08:45:34
    换言之,很可能数个使用执行某个 Stateless Session Bean 的 methods 时,会是同一个 Bean 的 Instance 执行。从内存方面来看, Stateful Session Bean 与 Stateless Session Bean 比较, Stateful Session ...
  • 换言之,很可能数个使用执行某个 Stateless Session Bean 的 methods 时,会是同一个 Bean 的 Instance 执行。从内存方面来看, Stateful Session Bean 与 Stateless Session Bean 比较, Stateful Session ...
  • 实例014 使当前项目依赖另一个项目 1.3 界面设计器 实例015 安装界面设计器 实例016 设计Windows系统的运行对话框界面 实例017 设计计算器程序界面 实例018 设计关于进销存管理系统的界面 第2章 Java基础应用...
  • 实例014 使当前项目依赖另一个项目 1.3 界面设计器 实例015 安装界面设计器 实例016 设计Windows系统的运行对话框界面 实例017 设计计算器程序界面 实例018 设计关于进销存管理系统的界面 第2章 Java基础应用...
  • 实例014 使当前项目依赖另一个项目 1.3 界面设计器 实例015 安装界面设计器 实例016 设计Windows系统的运行对话框界面 实例017 设计计算器程序界面 实例018 设计关于进销存管理系统的界面 第2章 Java基础应用...
  • 实例014 使当前项目依赖另一个项目 1.3 界面设计器 实例015 安装界面设计器 实例016 设计Windows系统的运行对话框界面 实例017 设计计算器程序界面 实例018 设计关于进销存管理系统的界面 第2章 Java基础应用...
  • 实例014 使当前项目依赖另一个项目 1.3 界面设计器 实例015 安装界面设计器 实例016 设计Windows系统的运行对话框界面 实例017 设计计算器程序界面 实例018 设计关于进销存管理系统的界面 第2章 Java基础应用...
  • 实例014 使当前项目依赖另一个项目 21 1.3 界面设计器 22 实例015 安装界面设计器 22 实例016 设计Windows系统的运行对话框 界面 23 实例017 设计计算器程序界面 26 实例018 设计关于进销存管理系统的界面 27 第2章 ...
  • 实例014 使当前项目依赖另一个项目 21 1.3 界面设计器 22 实例015 安装界面设计器 22 实例016 设计Windows系统的运行对话框 界面 23 实例017 设计计算器程序界面 26 实例018 设计关于进销存管理系统的界面 27 第2章 ...
  • 实例014 使当前项目依赖另一个项目 21 1.3 界面设计器 22 实例015 安装界面设计器 22 实例016 设计Windows系统的运行对话框 界面 23 实例017 设计计算器程序界面 26 实例018 设计关于进销存管理系统的界面 27 第2章 ...
  • 实例014 使当前项目依赖另一个项目 21 1.3 界面设计器 22 实例015 安装界面设计器 22 实例016 设计Windows系统的运行对话框 界面 23 实例017 设计计算器程序界面 26 实例018 设计关于进销存管理系统的界面 27 第2章 ...
  • 说明 : 指定在一个共享服务器环境可同时运行的共享服务器进程的最大数量。 值范围: 根据操作系统而定。 默认值 : 20 dispatchers: 说明 : 为设置使用共享服务器的共享环境而设置调度程序的数量和类型。可以为该...
  • ThreadLocal提供了一种访问某个变量的特殊方式:访问到的变量属于当前线程,即保证每个线程的变量不一样,而同一个线程在任何地方拿到的变量都是一致的,这就是所谓的线程隔离。 b. 如果要使用ThreadLocal,通常...
  • 4.3.4 自己的代码,如果创建一个java.lang.String类,这个类是否可以被类加载器加载?为什么。 4.3.5 说一说你对java.lang.Object对象hashCode和equals方法的理解。什么场景下需要重新实现这两个方法。 ...
  • 概念:设计一个类,这个类只能创建一个对象。(限制创建对象对象数量) 2. 怎么设计? 控制创建对象的数量 => 创建对象通过new 调用构造方法 => 控制构造方法就能控制创建对象 控制调用构造方法 =...
  • 阿里代码规范题目+答案50道题,不乱码不套路,便宜实惠。 多选 1....ABC ...避免不同的子项目,声明同一个二方库的不同版本号。 单选 27.关于二方库升级,下列哪些说法是正确的:B A .升级二
  • 正因为这样的设计,ET框架可以将所有的服务器组件都挂在一个服务器进程上,那么这个服务器进程就有了所有服务器的功能,一个进程就可以作为整组分布式服务器使用。这也类似电脑,台式机有所有的电脑组件,那它也完全...
  • oracle数据库经典题目

    2011-02-17 15:05:20
    当多个用户同时连接同一个实例时,SGA区数据供多个用户共享,所以SGA区又称为共享全局区。用户对数据库的各种操作主要SGA区进行。该内存区随数据库实例的创建而分配,随实例的终止而释放。PGA区是用户进程连接...
  • C#微软培训教材(高清PDF)

    千次下载 热门讨论 2009-07-30 08:51:17
    第三章 编写第一个应用程序 .20 3.1 Welcome 程序 .20 3.2 代 分 析 .20 3.3 运 行 程 序 .23 .4 添 加 注 释 .25 3.5 小 结 .27 第二部分 C#程序设计基础.28 第四章 数 据 类 型 .28 4.1 值 类 型...
  • Apache Sqoop: 是一个用来将Hadoop和关系型数据库的数据相互转移的工具,可以将一个关系型数据库(MySQL ,Oracle ,Postgres等)的数据导进到Hadoop的HDFS,也可以将HDFS的数据导进到关系型数据库 ...
  • C#微软培训资料

    2014-01-22 14:10:17
    第三章 编写第一个应用程序 .20 3.1 Welcome 程序 .20 3.2 代 分 析 .20 3.3 运 行 程 序 .23 .4 添 加 注 释 .25 3.5 小 结 .27 第二部分 C#程序设计基础.28 第四章 数 据 类 型 .28 4.1 值 类 型...
  • 所以对工具类进行了优化,把输入参数封装在一个对象里,这样以后再扩展输入参数,直接修改这个类就ok了。 轻松把玩HttpClient之封装HttpClient工具类(五),携带Cookie的请求 最近更新了一下HttpClientUtil工具类...
  • 手机 pdf 阅读器

    2009-02-12 23:00:29
    对于大家意见比较大的耗电量的问题,改进阅读时的算法及绘图方式,运算量最高可降至上版本的2%,平均值为上版本的6%左右,但由于阅读时耗电量的大头仍然是屏幕发光引起的,因此,只能在一定程序上减少耗电量。...
  •  静态编译后的易语言EXE/DLL之间不能再共享譬如窗口、窗口组件等类似资源,对于已经静态连接到一个EXE/DLL的支持库,该支持库的数据或资源将不能再被其它EXE/DLL使用的同名支持库访问。这是因为代码被分别...

空空如也

空空如也

1 2
收藏数 27
精华内容 10
关键字:

java锁只能在同一个线程中使用码

java 订阅