并发编程 - Synchronized
文章目录
- 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相关推荐
- 并发编程-synchronized
并发编程-synchronized 说在前面的话 正如我开篇所说,我要整理一些java并发编程的学习文档,这一篇就是第三篇:synchronized关键字. 主要说synchronized关键字的使用 ...
- Java并发编程 synchronized保证线程安全的原理
文章转载致博客 blog.csdn.net/javazejian/- 自己稍加完善. 线程安全是并发编程中的重要关注点,应该注意到的是,造成线程安全问题的主要诱因有两点,一是存在共享数据(也称临界资源 ...
- Java并发编程—Synchronized底层优化(偏向锁、轻量级锁)
原文作者:Matrix海 子 原文地址:Java并发编程:Synchronized底层优化(偏向锁.轻量级锁) 目录 一.重量级锁 二.轻量级锁 三.偏向锁 四.其他优化 五.总结 一.重量级锁 上篇 ...
- Java 并发编程—Synchronized关键字
原文作者:liuxiaopeng 原文地址:Java并发编程:Synchronized及其实现原理 目录 一.Synchronized的基本使用 二.Synchronized 原理 三.运行结果解释 ...
- synchronized原理_Java并发编程 -- synchronized保证线程安全的原理
线程安全是并发编程中的重要关注点,应该注意到的是,造成线程安全问题的主要诱因有两点,一是存在共享数据(也称临界资源),二是存在多条线程共同操作共享数据.因此为了解决这个问题,我们可能需要这样一个方案, ...
- synchronized原理_Java并发编程—synchronized保证线程安全的原理分析
前言 程安全是并发编程中的重要关注点,应该注意到的是,造成线程安全问题的主要诱因有两点,一是存在共享数据(也称临界资源),二是存在多条线程共同操作共享数据.因此为了解决这个问题,我们可能需要这样一个方 ...
- Java并发编程 Synchronized及其实现原理
Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法.Synchronized的作用主要有三个:(1)确保线程互斥的访问同步代码(2)保证共享变量的修改能够及时可见 ...
- Java并发编程-synchronized锁优化
目录 1.小故事 2.轻量级锁 3.锁膨胀 4.自旋优化 5.偏向锁 5.1.概述 5.2.偏向锁状态 5.3.偏向锁撤销 5.3.1.调用对象hashCode 5.3.2.其它线程使用对象 5.3. ...
- Java并发编程synchronized详解
一.关于临界区.临界资源.竞态条件和解决方法 首先看如下代码,thread1对变量i++做500次运算,thread2对i--做500次运算,但是最终的结果却可能为是正数,负数,0不一样的结果. pa ...
最新文章
- Oracle创建表空间(转)
- LeetCode Max Consecutive Ones
- 经典网页设计:15个使用网格系统的精美网站作品
- BugkuCTF–flag在index里
- 【通知】有三AI运营组成员招收条件及管理暂行方案,你是否想好与有三AI共进退...
- noj一道简单的数学题
- PHP OPCode缓存:APC详细介绍
- 十年Java路,和大家来谈谈系统架构
- linux缓存文件用户权限错误,Laravel运行缓存权限问题
- 探索比特币源码3-熟悉RPC接口
- Windows巡检IIS指标脚本(PowerShell实现)
- c语言字符串传给swift,如何把字符串数组从 Swift 传递给 C
- Linux下实现Raid 5软阵列
- snmp服务没有安全设置项
- WordPress 速度优化的完整指南
- Stetman读paper小记:Backdoor Learning: A Survey(Yiming Li, Yong Jiang, Zhifeng Li, Shu-Tao Xia)
- html怎么定义submit,HTML Input Submit value用法及代码示例
- RealAI:清华团队打造第三代安全可控人工智能 | 百万人学AI评选
- html微信网页字体被放大问题
- 视频教程- 项目管理工具(1) WBS-工作分解结构-研发管理
热门文章
- 计算机管理找不到指定模块,Win7卸载软件时提示找不到指定模块图文教程
- 基于python开发pepper机器人的人脸识别--使用facenet
- Hadoop | Stom
- WELCOME THE NEW GAY
- QT5.9.0配置opencv
- 一个精简内核配置的方法 (感谢 flw2 兄分享)
- thegraph部署子图到私有节点macos
- MFC绘制双有理Bezier曲面
- Android考勤毕业论文,基于android的考勤系统的设计与实现.doc
- android service常驻通知栏,android实现常驻通知栏遇到的问题及解决办法