文章目录

  • 1.为什么要使用synchronized
  • 2.实现原理
  • Synchronized的作用主要有三个:
  • 3.synchronized的三种应用方式
  • synchronized jdk版本
  • synchronized的可重入性

1.为什么要使用synchronized

在并发编程中存在线程安全问题,主要原因有:1.存在共享数据 2.多线程共同操作共享数据。关键字synchronized可以保证在同一时刻,只有一个线程可以执行某个方法或某个代码块,同时synchronized可以保证一个线程的变化可见(可见性),即可以代替volatile。
案例

package com.yxl.demo.ThreadTest;public class test5 {public static void main(String[] args) {TestDemo thread = new TestDemo();Thread t1 = new Thread(thread,"窗口一");Thread t2 = new Thread(thread,"窗口二");t1.start();t2.start();}
}class TestDemo implements Runnable{//共享的火车票变量private volatile  int count = 100;//重寫run方法@Overridepublic void run() {while (count > 0){try {Thread.sleep(50);}catch (Exception e){e.getMessage();}sale();}}public void sale(){if(count > 0){System.out.println(Thread.currentThread().getName() +"出售 :" +(100 - count + 1));count--;}}}会出现火车票卖重复的问题,

2.实现原理

synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性

Synchronized的作用主要有三个:

原子性:确保线程互斥的访问同步代码;
可见性:保证共享变量的修改能够及时可见,其实是通过Java内存模型中的 “对一个变量unlock操作之前,必须要同步到主内存中;如果对一个变量进行lock操作,则将会清空工作内存中此变量的值,在执行引擎使用此变量前,需要重新从主内存中load操作或assign操作初始化变量值” 来保证的;
有序性:有效解决重排序问题

3.synchronized的三种应用方式

Java中每一个对象都可以作为锁,这是synchronized实现同步的基础:

普通同步方法(实例方法)锁是当前实例对象 ,进入同步代码前要获得当前实例的锁

public synchronized  void sale(){if(count > 0){System.out.println(Thread.currentThread().getName() +"出售 :" +(100 - count + 1));count--;}}

静态同步方法**,锁是当前类的class对象 ,进入同步代码前要获得当前类对象的锁**

public static synchronized  void sale(){if(count > 0){System.out.println(Thread.currentThread().getName() +"出售 :" +(100 - count + 1));count--;}}

同步代码块锁是括号里面的对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。

private Object object =new Object();public void sale(){synchronized (object){if(count > 0){System.out.println(Thread.currentThread().getName() +"出售 :" +(100 - count + 1));count--;}}}

synchronized jdk版本

在jdk1.6之前,synchronized是非常重量级的,因为它会无时无刻进行锁住对象,而不考虑到程序实际的竞争情况,大多数程序在都是进行交替执行,也就是说不存在资源的竞争,如果没有竞争,但是加锁,加锁和解锁是非常耗费性能的,(重量级)因为线程之间的切换以及线程从内核态到用户态的时间是耗费性能的。

在jdk1.6之后,sun公司对synchronized进行了大幅度的优化,现在采用偏向锁+(轻量级锁+cas)+重量级,之间通过锁碰撞进行切换。

后面对于锁新出文章进行讲解

synchronized的可重入性

从互斥锁的设计上来说,当一个线程试图操作一个由其他线程持有的对象锁的临界资源时,将会处于阻塞状态,但当一个线程再次请求自己持有对象锁的临界资源时,这种情况属于重入锁,请求将会成功,在java中synchronized是基于原子性的内部锁机制,是可重入的,因此在一个线程调用synchronized方法的同时在其方法体内部调用该对象另一个synchronized方法,也就是说一个线程得到一个对象锁后再次请求该对象锁,是允许的,这就是synchronized的可重入性

并发编程 - Synchronized相关推荐

  1. 并发编程-synchronized

    并发编程-synchronized 说在前面的话 正如我开篇所说,我要整理一些java并发编程的学习文档,这一篇就是第三篇:synchronized关键字. 主要说synchronized关键字的使用 ...

  2. Java并发编程 synchronized保证线程安全的原理

    文章转载致博客 blog.csdn.net/javazejian/- 自己稍加完善. 线程安全是并发编程中的重要关注点,应该注意到的是,造成线程安全问题的主要诱因有两点,一是存在共享数据(也称临界资源 ...

  3. Java并发编程—Synchronized底层优化(偏向锁、轻量级锁)

    原文作者:Matrix海 子 原文地址:Java并发编程:Synchronized底层优化(偏向锁.轻量级锁) 目录 一.重量级锁 二.轻量级锁 三.偏向锁 四.其他优化 五.总结 一.重量级锁 上篇 ...

  4. Java 并发编程—Synchronized关键字

    原文作者:liuxiaopeng 原文地址:Java并发编程:Synchronized及其实现原理 目录 一.Synchronized的基本使用 二.Synchronized 原理 三.运行结果解释 ...

  5. synchronized原理_Java并发编程 -- synchronized保证线程安全的原理

    线程安全是并发编程中的重要关注点,应该注意到的是,造成线程安全问题的主要诱因有两点,一是存在共享数据(也称临界资源),二是存在多条线程共同操作共享数据.因此为了解决这个问题,我们可能需要这样一个方案, ...

  6. synchronized原理_Java并发编程—synchronized保证线程安全的原理分析

    前言 程安全是并发编程中的重要关注点,应该注意到的是,造成线程安全问题的主要诱因有两点,一是存在共享数据(也称临界资源),二是存在多条线程共同操作共享数据.因此为了解决这个问题,我们可能需要这样一个方 ...

  7. Java并发编程 Synchronized及其实现原理

    Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法.Synchronized的作用主要有三个:(1)确保线程互斥的访问同步代码(2)保证共享变量的修改能够及时可见 ...

  8. Java并发编程-synchronized锁优化

    目录 1.小故事 2.轻量级锁 3.锁膨胀 4.自旋优化 5.偏向锁 5.1.概述 5.2.偏向锁状态 5.3.偏向锁撤销 5.3.1.调用对象hashCode 5.3.2.其它线程使用对象 5.3. ...

  9. Java并发编程synchronized详解

    一.关于临界区.临界资源.竞态条件和解决方法 首先看如下代码,thread1对变量i++做500次运算,thread2对i--做500次运算,但是最终的结果却可能为是正数,负数,0不一样的结果. pa ...

最新文章

  1. 利用XtraBackup做mysql不停机重做主从复制
  2. 皮一皮:低调的凡尔赛...
  3. Android去掉顶部的阴影
  4. 利用PHP的Popen实现RRDTOOL作图的动态输出
  5. 三个箭头循环标志_沧州交通标志杆直销
  6. php 子网掩码正则,验证子网掩码正则表达式代码范例
  7. 巴菲特:比特币纯粹是FOMO(害怕错过)
  8. 数据结构排序系列详解之二 希尔排序
  9. SQL语法中的JOIN类型
  10. 三大器之------生成器
  11. 算法设计与分析基础_学习笔记
  12. android地区/时区/语言
  13. android drm框架分析,如何使用android.drm框架
  14. Deep Learning中的层结构
  15. 篮球——NBA球队队标
  16. 超最小二乘椭圆拟合函数----MATLAB实现
  17. 北京的电竞学校的要求有哪些?
  18. 通过京东商品ID获取京东商品评论数据,京东商品评论API接口,接口说明接入方案
  19. android中listView下拉刷新
  20. padding的用法

热门文章

  1. solidworks画渐开线直齿轮(不用toolbox和其他工具箱)
  2. python测试10.28
  3. luffcc项目-08-课程详情页、CKEditor富文本编辑器、课程详情页面、后台接口
  4. linux 不删除文件,清空文件内容命令
  5. 反编译系列教程(上)
  6. 计算机技术论文 系统,计算机络技术论文论文
  7. 【深度报道】用友企业云服务推出新品 打造中国企业云服务高地
  8. maven中央仓库找不到jconsole-1.8.0.jar和tools-1.8.0.jar包
  9. 基于超星网页阅读的在线阅读的书籍下载软件,java实现。
  10. MyEclipse如何复制项目、无法修改web-context-root问题解决办法/ Repeated column in mapping for entity