先来看一个线程安全的例子 ,两个线程对count进行累加,共累加10万次。

public class AddTest {
public static void main(String[] args) {
MyAddRunnable addRunnable = new MyAddRunnable();
Thread thread1 = new Thread(addRunnable);
Thread thread2 = new Thread(addRunnable);
thread1.start();
thread2.start();
try {
thread1.join();
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
} System.out.println(addRunnable.count);
} } class MyAddRunnable implements Runnable {
public int count = 0; @Override
public void run() {
for (int i = 0; i < 100000; i++) {
count++;
}
} }

  

 随便运行多少次这个程序,都得不到正确的结果 200000

于是乎 引出今天的问题,线程安全问题。

怎么解决呢,有多种解决方法,现在来说2种,

第一种    在 Add 类的 run方法上 加synchronized

第二种   使用无锁的类

public class AtomicIntTest {
public static void main(String[] args) {
AddRunnable addRunnable = new AddRunnable();
Thread myThread1 = new Thread(addRunnable);
Thread myThread2 = new Thread(addRunnable);
myThread1.start();
myThread2.start();
try {
myThread1.join();
myThread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
} System.out.println(addRunnable.count);
} } class AddRunnable implements Runnable {
AtomicInteger count = new AtomicInteger(); @Override
public void run() {
for (int i = 0; i < 100000; i++) {
count.incrementAndGet();
}
} }

  

synchronized 关键词 详解

 方法上(对象锁) 比如在某个对象的方法上加锁,如果哪个线程先执行到synchronized 的代码块 相当于 持有了该方法所属对象的锁

 静态方法 表示锁定 .class类 ,类一级别的锁,独占(.class类)

 同步代码块

解决线程安全问题其实只需限制对共享资源访问的不确定性即可。使用同步方法时,使得整个方法体都成为了同步执行状态,会使得可能出现同步范围 过大的情况,于是,我们可以针对需要同步的代码可以直接另一种同步方式——同步代码块来解决

  实际开发中,也不太建议直接在方法上加锁,只加在需要同步的地方就好。

同步代码块的格式为:

synchronized (obj) {

//...

}

一定要注意:必须锁住的是同一个对象才可以。。。。

 

synchronized修饰普通方法或者synchronized(this)获取的是对象锁 调用该对象的同步方法会阻塞

synchronized 静态方法,或者synchronized(this.getClass())这样的写法,就相当于全局锁,和对象实例无关。

synchronized(obj)锁住的是括号中的对象,如果不是同一个对象则不会阻塞。

Java多线程系列3 synchronized 关键词的更多相关文章

  1. java多线程系列(五)---synchronized ReentrantLock volatile Atomic 原理分析

    java多线程系列(五)---synchronized ReentrantLock volatile Atomic 原理分析 前言:如有不正确的地方,还望指正. 目录 认识cpu.核心与线程 java ...

  2. java多线程系列之 synchronized

    一.synchronized基本原理 java的内置锁:每个java对象都可以用做一个实现同步的锁,这些锁成为内置锁.线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块或方法时会释放该锁. ...

  3. java多线程系列6 synchronized 加强版 ReentrantLock

    ReentrantLock类是可重入.互斥.实现了Lock接口的锁,它与使用synchronized方法和快具有相同的基本行为和语义,并且扩展了其能力.ReenreantLock类的常用方法有: Re ...

  4. java多线程系列 目录

    Java多线程系列1 线程创建以及状态切换    Java多线程系列2 线程常见方法介绍    Java多线程系列3 synchronized 关键词    Java多线程系列4 线程交互(wait和 ...

  5. Java多线程系列--“基础篇”04之 synchronized关键字

    概要 本章,会对synchronized关键字进行介绍.涉及到的内容包括:1. synchronized原理2. synchronized基本规则3. synchronized方法 和 synchro ...

  6. Java多线程系列--“JUC锁”03之 公平锁(一)

    概要 本章对“公平锁”的获取锁机制进行介绍(本文的公平锁指的是互斥锁的公平锁),内容包括:基本概念ReentrantLock数据结构参考代码获取公平锁(基于JDK1.7.0_40)一. tryAcqu ...

  7. Java多线程系列--“JUC锁”04之 公平锁(二)

    概要 前面一章,我们学习了“公平锁”获取锁的详细流程:这里,我们再来看看“公平锁”释放锁的过程.内容包括:参考代码释放公平锁(基于JDK1.7.0_40) “公平锁”的获取过程请参考“Java多线程系 ...

  8. Java多线程系列--“JUC锁”01之 框架

    本章,我们介绍锁的架构:后面的章节将会对它们逐个进行分析介绍.目录如下:01. Java多线程系列--“JUC锁”01之 框架02. Java多线程系列--“JUC锁”02之 互斥锁Reentrant ...

  9. Java多线程系列目录(共43篇)

    最近,在研究Java多线程的内容目录,将其内容逐步整理并发布. (一) 基础篇 01. Java多线程系列--“基础篇”01之 基本概念 02. Java多线程系列--“基础篇”02之 常用的实现多线 ...

随机推荐

  1. Docker三大核心概念及DockerToolBox安装

    一.核心概念 Docker大部分操作都围绕三大概念——镜像.容器和仓库展开. 1.Docker镜像 Docker镜像类似于虚拟机镜像,可以将它理解为一个只读的模板.镜像是创建Docker容器的基础. ...

  2. pytorch下的lib库 源码阅读笔记(1)

    置顶:将pytorch clone到本地,查看initial commit,已经是麻雀虽小五脏俱全了,非常适合作为学习模板. 2017年12月7日01:24:15 2017-10-25 17:51 参 ...

  3. 用网站把图标做成iconFont文件引用

    1,把psd文件另存为eps文件(ai能打开的格式),前提图标有路径, 2,用ai打开eps文件 3,新建一个空白文件100*100,然后把图标复制进来,等比拉宽至最大化 4,如果图标有蒙版,就点击图 ...

  4. OS&SYS&Shuti模块

    #sys.argv   主要针对脚本可以读取参数 Shuti模块 import shutil f1=open('笔记',encoding='utf-8') f2=open('笔记2','w',enco ...

  5. IDEA查看类继承关系及生成类关系图

    1.在想要查看的类上按 Ctrl + H -> Diagrams -> Show Diagrams -> Java Class Diagrams -> Show Impleme ...

  6. 实验三:xen环境下的第一个虚拟机的安装

    实验名称: xen环境下的第一个虚拟机的安装 实验环境: 我们这里继续上面实验二来完成这个实验: 环境则是xen的安装环境,如下图: 开启虚拟机的的硬件辅助虚拟化功能: 实验要求: 这里我们通过安装b ...

  7. Dubbo-admin管理平台的安装

      1.到地址 https://github.com/alibaba/dubbo 下载dubbo源码  2.解压缩zip文件到 “ D:\技术资料\zookeeper\dubbo-master\dub ...

  8. spring 之 property-placeholder 分析

    不难知道, property-placeholder 的解析是 PropertyPlaceholderBeanDefinitionParser 完成的, 但是 它仅仅是个parser , 它仅仅是读取 ...

  9. git自定义项目钩子和全局钩子

    钩子介绍 自定义钩子分为:项目钩子和全局钩子 自定义全局钩子: 全局钩子目录结构: (注意:excludes目录结构是我们自定义的目录,规则逻辑在update.d/update.py脚本里实现的,非g ...

  10. 为Firefox浏览器安装Firebug插件

    一.确保联网 二.打开Firefox 三.菜单:工具 -> 附加组件 显示附加组件管理器界面,点扩展 在搜索框输入firebug,搜,在搜索结果列表中找到Firebug项,安装 安装进度 安装完 ...