一. 同步的原因

synchronized的代码块的封装作用,我们已经认识到了。但是它到底是怎么起到作用,现在来讨论一下。

这里面有一个对象,我们先简单地将它理解为标志位。这标志位怎么用的呢?

现在假想标志位有0和1,如果先来的默认值是1。这时,来了四个不同编号的线程,0~3。

0线程进来后,synchronized后面的标志位为1,(1代表着开着),进来后,就把1置为了0。标志位在0和1之间,进行了切换。

0和1可以理解为真假的假。当标志位为0的时候,后面的线程1,2,3读synchronized的时候,都进不来。

当0线程进来后,经过判断,开始执行语句,try里面有一个sleep语句。一旦0线程运行了sleep语句,cpu就开始切换到其他线程上了。

0线程释放了资格,释放了执行权。但是拿到执行权的其他线程,由于标志位为0,都进不来。这时,0线程醒了,执行完剩下的语句,就直接退出了。0线程刚推出的时候,就把标志位0变为了1。按照这个道理,1~3线程都是一样的过程。

这样一来,object就像锁一样。这是对象锁,或者同步锁。刚才说的标志位概念并不存在,真正的概念是锁。

为什么要放一个对象锁进来,后期要对同步中的线程进行监视,因为监视的方法都在锁上呢。

对象锁,同步地解决线程安全的原因。到这,同步的基本特点就介绍完了。

二. 同步的特点

线程里的问题很多,这里只是解决了部分问题。(同步应该说的是多个代码语句一起执行,比如这里的if判断,和try,以及输出语句)

0线程进到synchronized代码块中后,会一直持有cpu的执行权么?不会,如果一直持有,那么其他程序根本运行不了,比如说QQ,360....这就意味着,此时,cpu的执行权会切换到其他线程上,如1~3,但是无论这三个线程谁拿到执行权,都会被判断同步锁,判断完,进不去。相当于无效判断,所以效率会有点低。

这个效率低是可以在我们的承受范围之内的。

java封装弊端_JAVA-初步认识-第十三章-同步的好处和弊端相关推荐

  1. 《Java编程思想》读书笔记 第十三章 字符串

    <Java编程思想>读书笔记 第十三章 字符串 不可变String String对象是不可变的,每一个看起来会修改String值的方法,实际上都是创建一个全新的String对象,以及包含修 ...

  2. java封装数组_Java封装数组之动态数组实现方法详解

    本文实例讲述了Java封装数组之动态数组实现方法.分享给大家供大家参考,具体如下: 前言:在此之前,我们封装的数组属于静态数组,也即数组空间固定长度,对于固定长度的数组当元素超过容量时会报数组空间不足 ...

  3. java 封装浏览器_JAVA浏览器实现方式

    在使用 Java 开发客户端程序时,有时会需要在界面中使用网页浏览器组件,用来显示一段 HTML 或者一个特定的网址.本文将介绍在界面中使用浏览器组件的四种方法,给出示例的代码,并且分析每种方法的优点 ...

  4. java封装例题_java面向对象编程类的封装接口和基本类库练习题

    面向对象编程基本知识练习 一.判断题 1.不需要定义类,就能创建对象.() 2.构造方法用于给类的 private 实例变量赋值.() 3.对象一经声明就可以立即使用.() 4.在定义变量和方法时,必 ...

  5. java 封装 英文_java类的封装、继承、多态

    一.封装(encapsulation) 封装性就是把类(对象)的属性和行为结合成一个独立的相同单位,并尽可能隐蔽类(对象)的内部细节,对外形成一个边界,只保留有限的对外接口使之与外部发生联系.封装的特 ...

  6. java封装概念_Java面向对象----封装概念

    封装 信息隐藏,隐藏对象的细节 访问修饰符 public private protected 默认 属性封装的实现 方法封装的目的(隐藏方法实现细节) package com.tanlei.newer ...

  7. java 超时集合_Java之集合(二十三)SynchronousQueue

    1.前言 本章介绍阻塞队列SynchronousQueue.之前介绍过LinkedTransferQueue,特点提供了让生产者知道消费者消费了其产出,没消费就等待的模式,本章介绍的这个类则必须是生产 ...

  8. java 唯一流水号_JAVA流水号生成规格,采用同步单例生成,保证永远唯一

    流水号格式为yyyyMMddXXXX,规定每天只能到9999,代码如下: 01 import java.text.DecimalFormat; 02 import java.text.SimpleDa ...

  9. java 容器排序_Java攻略第四章 容器类、排序

    前面就是Java小世界的出口,是不是心中涌起莫名的冲动,想要一步跳出门去?这种心情可以理解,因为你还没有遇到真正的怪物.喂,不要急!在你即将跳出门去的刹那,最好还是看一下这个小东西! 可不要小看它!它 ...

最新文章

  1. 估计一些物品的质量_新版人教版二年级数学下册《克和千克》教案
  2. 判断父元素是否为顶部_元素树,检查元素是否有特定的父元素?
  3. unity点击按钮换按钮图标
  4. 使用WinSCP上传文件到指定服务器
  5. C语言项目:水波纹效果实现
  6. Python上传文件到百度网盘(一)
  7. 联想控制计算机软件,联想网络控制工具
  8. 我的团长我的团第九集
  9. 2018-2019年江苏省高等学校“阿里云大数据技术实战训练营”大学生万人计划学术冬令营开营...
  10. R中五种常用的统计分析方法
  11. java 爬取ajax,R语言爬虫系列4|AJAX与动态网页介绍
  12. OpenCV python 轮廓的极值点
  13. Java环境下运行fastqc_在Ubuntu上安装FastQC
  14. [20180823]IMU与db link.txt
  15. 神武3 服务器维护公告,2021年3月19日更新公告
  16. 饭店餐饮点餐系统为什么这么受欢迎?
  17. sqlserver函数多行数据合并成一行
  18. Linux字体关联到wine中,Wine的中文显示与字体设置
  19. 【福利分享】Python爬虫入门实战——彼岸图网
  20. java毕业设计——基于java+Java Swing+jsp的企业快信系统设计与实现(毕业论文+程序源码)——企业快信系统

热门文章

  1. 独家干货 | 林轩田机器学习课程精炼笔记!
  2. 理想边界尺寸怎么算_钻石型淋浴房三边尺寸怎么算?安装步骤有哪些?
  3. python字符串与文本处理技巧(3):字符剔除、字符对齐、字符拼接、字符插入变量
  4. OpenGL编程指南14:混合半透明Blend
  5. go语言中的闭包结构
  6. (2)ARM Cortex-M3指令集
  7. 编译原理实验一预习报告
  8. Python变量使用前必须先声明,并且一旦声明就不能在当前作用域内改变其类型————(错)
  9. C语言中变量的链接属性
  10. 用双向链表实现一个栈