概述

synchronized是java中的一个关键字,也就是说是Java语言内置的特性。

synchronized( 一个任意的对象(锁) ){
代码块中放操作共享数据的代码。

}

public synchronized int getIndex() {return 1;}public static synchronized int getNext() {return 2;}public int getPre() {//这里的参数可以用java所有对象//synchronized(this) {//synchronized(Demo1.class) {synchronized(new Demo1()) {System.out.println("synchronized(这里的参数可以用java所有对象)");}return 0;}

synchronized 放在普通方法上,内置锁就是当前类的实例。

synchronized 放在静态方法上,内置锁就是当前类的Class字节码对象

如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,并执行该代码块时,其他线程便只能一直等待,等待获取锁的线程释放锁。这种特性又被称为互斥锁

而这里获取锁的线程释放锁只会有两种情况:
1)获取锁的线程执行完了该代码块,然后线程释放对锁的占有。
2)线程执行发生异常,此时JVM会让线程自动释放锁。

实例

继续卖火车票的例子。

在《Java中Runnable和Thread的区别》火车票例子里,我们看到三个窗口卖出去的火车票,顺序是乱的。

如何使顺序有序呢?

线程执行的时候,一个个执行不就有序了。即线程1在执行的时候,其他线程阻塞不要执行。

加synchronize。

package multithreading.sync;public class MyThreadWithImplements implements Runnable {private int tickets = 10;@Overridepublic synchronized void run() {for (int i = 0; i <= 100; i++) {if(tickets>0){System.out.println(Thread.currentThread().getName()+"--卖出票:" + tickets--);}}}public static void main(String[] args) {MyThreadWithImplements myRunnable = new MyThreadWithImplements();Thread thread1 = new Thread(myRunnable, "窗口一");Thread thread2 = new Thread(myRunnable, "窗口二");Thread thread3 = new Thread(myRunnable, "窗口三");thread1.start();thread2.start();thread3.start();}}

运行结果

窗口一--卖出票:10
窗口一--卖出票:9
窗口一--卖出票:8
窗口一--卖出票:7
窗口一--卖出票:6
窗口一--卖出票:5
窗口一--卖出票:4
窗口一--卖出票:3
窗口一--卖出票:2
窗口一--卖出票:1

缺陷

例子1

如果这个获取锁的线程由于要等待IO或者其他原因(比如调用sleep方法)被阻塞了,但是又没有释放锁,其他线程便只能干巴巴地等待,这多么影响程序执行效率。

因此就需要有一种机制可以不让等待的线程一直无期限地等待下去(比如只等待一定的时间或者能够响应中断),通过Lock就可以办到。

例子2

当有多个线程读写文件时,读写操作会发生冲突现象,写写操作会发生冲突现象,但是读读操作不会发生冲突现象。
但是采用synchronized关键字来实现同步的话,就会导致一个问题:
如果多个线程都只是进行读操作,当一个线程在进行读操作时,其他线程只能等待无法进行读操作。

因此就需要一种机制来使得多个线程都只是进行读操作时,线程之间不会发生冲突,通过Lock就可以办到。
另外,通过Lock可以知道线程有没有成功获取到锁。这个是synchronized无法办到的。
总的来说,也就是说Lock提供了比synchronized更多的功能。

参见:ReadWriteLock读写文件

同步关键词synchronized相关推荐

  1. java同步关键词解释、synchronized、线程锁(Lock)

    1.java同步关键词解释 21.1 synchronized synchronized是用来实现线程同步的!!! 加同步格式: synchronized( 需要一个任意的对象(锁) ){ 代码块中放 ...

  2. 同步锁(synchronized)_37

    同步锁 概念: 把有可能出现问题的代码包起来,一次只让一个线程执行.通过sychronized关键字实现同步. 当多个对象操作共享数据时,可以使用同步锁解决线程安全问题. synchronized(对 ...

  3. Java线程同步学习,线程不安全案例讲解,同步方法和同步块 synchronized

    本文主要是自己学习多线程时,所做的笔记,参考的是b站狂神说Java多线程视频讲解. 目录如下: 文章目录 线程同步 一.三大线程不安全案例 1.买票案例 2.不安全取钱 3.线程不安全 二.同步方法及 ...

  4. 线程同步机制synchronized中锁的判断以及锁的作用范围

    当我们使用多个线程访问同一资源(可以是同一个变量.同一个文件.同一条记录等)的时候,若多个线程只有读操作,那么不会发生线程安全问题,但是如果多个线程中对资源有读和写的操作,就容易出现线程安全问题. 要 ...

  5. java中实现线程互斥的关键词_简单的互斥同步方式——synchronized关键字详解

    2. synchronized的原理和实现细节 2.1 synchronized可以用在那些地方 静态方法,锁对象为当前类的class对象,不用显式指定 实例方法,锁对象为当前实例对象,不用显式指定 ...

  6. Java多线程的同步机制(synchronized)

    一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在 java里边就是拿到某个同步对象的锁(一个对象只有一把锁): 如果这个时候同步对象的锁被其他线程拿走了,他(这个 ...

  7. Java线程同步机制synchronized关键字的理解

    由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题.Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问. 需要明确的几个问题: ...

  8. Java线程同步:synchronized锁住的是代码还是对象

    在Java中,synchronized关键字是用来控制线程同步的,就是在多线程的环境下,控制synchronized代码段不被多个线程同时执行.synchronized既可以加在一段代码上,也可以加在 ...

  9. 多线程,线程同步,synchronized关键字的用法

    一.什么是多线程 Java多线程实现方式主要有四种:继承Thread类.实现Runnable接口.实现Callable接口通过FutureTask包装器来创建Thread线程.使用ExecutorSe ...

最新文章

  1. 图解VC++绘制数学曲线
  2. 这个公式竟然堪称数学界的画家......
  3. 7-53 两个有序序列的中位数 (25 分)(思路加详解)用STL容器中的set容器的自动去重过不去
  4. Hbase单点安装Version1.1.5
  5. P1030求先序排列
  6. php判断目录是否有写的权限,PHP版目录权限检测
  7. python ide安装_Python基础学习笔记(一)安装以及IDE的配置
  8. sklear中IsolationForest的使用场景
  9. 液晶手写板原理拆解_汽车抬头显示HUD的拆解
  10. 安全隐患分析和基本系统结构信息的收集
  11. 此男因为什么被送进医院?
  12. 中国最美的一千个汉字 : 千字文
  13. 什么是java全栈工程师
  14. 不负韶华 只争朝夕(2019年终报告)
  15. 深度学习研究生常用网站||图像处理||医学影像||使用评价||汇总
  16. element-UI 图标点击切换
  17. JavaSE探赜索隐之乾坤袋(集合)
  18. 记一次服务器被植入木马/病毒:kdevtmpfsi
  19. “云”智慧仪器与“云”智慧测试时代——数采DAQ、虚拟仪器VI和“试验室网络云时代”
  20. FME转换LPK层文件到AUTOCAD报错

热门文章

  1. bat 变量 文件内容第一行_VBA基础入门(38)FSO生成bat文件后执行的实例
  2. destoon网站mysql分表_destoon : 常用数据库操作
  3. 陷阱计算机音乐谱大全,陷阱 原版C调-王北车-和弦谱-《弹吧》官网tan8.com-和弦谱大全,学吉他,秀吉他...
  4. java上传视频到七牛云_Java进阶学习:将文件上传到七牛云中
  5. mysql给字段添加描述_用sql 语句给字段添加描述
  6. ubutun 更换网络源_「ubuntu脚本1」开启ssh替换第三方源开启tab键补齐屏蔽nouveau
  7. 合作开发过程产生的专利_被起诉专利侵权怎么办?专利律师给你出招!
  8. 你用计算机做过什么事情,他偷偷干了什么?(电脑)
  9. 在c语言程序中 对文件进行操作首先要,《C语言程序设计》试题八及答案
  10. Simple Addition expression【打表+二分】