对实现了Runnable或者Callable接口类,可以通过多线程执行同一实例的runcall方法,那么对于同一实例中的局部变量(非方法变量)就会有多个线程进行更改或读取,这就会导致数据不一致,synchronized(关键字)可以解决多线程共享数据同步的问题

synchronized使用说明

作用范围

synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:

  1. 修饰一个代码块:被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象
  2. 修饰一个非静态方法:被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象
  3. 修改一个静态的方法:其作用的范围是整个静态方法,作用的对象是这个类的所有对象
  4. 修改一个类:其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象

高能提示:
No1 > synchronized修饰的非静态方法:如果一个对象多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,则这个线程所属对象其它线程不能同时访问这个对象任何一个synchronized方法
No2 > synchronized关键字是不能继承的:基类的方法synchronized function(){}在继承类中并不自动是synchronized function(){},而是变成了function(){}。继承类需要你显式的指定它的某个方法为synchronized方法,可以通过子类调用父类的同步方法来实现同步
No3 > 针对synchronized修饰代码块和非静态方法,本质上锁的是代码块或非静态方法对应的对象代码块是synchronized标注的变量,非静态方法是所在类对应的实例),如果是不同的对象是可以同时访问的
No4 > 实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制
No5 > 每个对象只有一个锁(lock)与之相关联
No6 > 在定义接口方法时不能使用synchronized关键字
No7 > 构造方法不能使用synchronized关键字,但可以使用synchronized代码块来进行同步

1. 修饰一个代码块

public void syncCode(Object o) {synchronized (o) {// 同步代码块}
}

上面的锁就是o这个对象,当然多个线程同步需要保证o这个对象是同一个,这是有明确的对象作为锁的情况,如果只是想单纯的让某一段代码同步,并没有明确的对象作为锁,可以创建一个特殊的instance变量来充当锁
synchronized(o)修饰的代码块,其中o可以取值一个对象或者一个变量或者this亦或者Clz.class

public class Sync implements Runnable {private byte[] lock = new byte[0];public void syncCode() {synchronized (lock) {// 同步代码块}}public void run ....
}

零长度的byte数组对象创建起来将比任何对象都经济,查看编译后的字节码,生成零长度的byte[]对象只需3条操作码,而Object lock = new Object()则需要7行操作码

2. 修饰一个非静态方法

public synchronized void method() {// .....}

此时锁的是调用这个同步方法的对象

3. 修饰一个静态方法

public synchronized static void method() {// .....}

synchronized修饰的静态方法锁定的是这个类的所有对象

4. 修饰类

public class Sync implements Runnable {public void syncCode() {synchronized (Sync.class) {// 同步代码块}}public void run ....
}

和作用于静态方法一样,synchronized作用于一个类时,是给这个类加锁,类的所有对象用的是同一把锁

总结

  1. 线程同步的目的是为了保护多个线程反问一个资源时对资源的破坏。
  2. 线程同步方法是通过锁来实现,每个对象都有切仅有一个锁,这个锁与一个特定的对象关联,线程一旦获取了对象锁,其他访问该对象的线程就无法再访问该对象的其他非同步方法
  3. 对于静态同步方法,锁是针对这个类的,锁对象是该类的Class对象。静态和非静态方法的锁互不干预。一个线程获得锁,当在一个同步方法中访问另外对象上的同步方法时,会获取这两个对象锁。
  4. 对于同步,要时刻清醒在哪个对象上同步,这是关键。
  5. 编写线程安全的类,需要时刻注意对多个线程竞争访问资源的逻辑和安全做出正确的判断,对"原子"操作做出分析,并保证原子操作期间别的线程无法访问竞争资源。
  6. 当多个线程等待一个对象锁时,没有获取到锁的线程将发生阻塞。
  7. 死锁是线程间相互等待锁锁造成的,在实际中发生的概率非常的小,一旦程序发生死锁,程序将死掉

@Java | Thread synchronized - [ 线程同步锁 基本使用]相关推荐

  1. Java多线程之线程同步机制(锁,线程池等等)

    Java多线程之线程同步机制 一.概念 1.并发 2.起因 3.缺点 二.三大不安全案例 1.样例一(模拟买票场景) 2.样例二(模拟取钱场景) 3.样例三(模拟集合) 三.同步方法及同步块 1.同步 ...

  2. java多线程之线程同步问题

    1.线程不安全的问题分析 当多线程并发访问同一个资源对象的时候,可能出现线程不安全的问题.但是,我们分析打印的结果,发现没有问题: 为了让问题更明显:     Thread.sleep(10);//当 ...

  3. java多线程:线程同步synchronized(不同步的问题、队列与锁),死锁的产生和解决

    0.不同步的问题 并发的线程不安全问题: 多个线程同时操作同一个对象,如果控制不好,就会产生问题,叫做线程不安全. 我们来看三个比较经典的案例来说明线程不安全的问题. 0.1 订票问题 例如前面说过的 ...

  4. Java多线程编程——线程同步与线程安全问题及synchronized关键字

    在多线程环境下,我们常常需要让多个线程同时去操作同一资源.在某些情况下,这种情形会导致程序的运行结果出现差错.专业上的,当多个线程在执行同一段代码的时候,每次的执行结果和单线程执行的结果都是一样的,不 ...

  5. java同步锁售票_线程同步锁之火车站售票案例

    前言: 谈到多线程,就不得不说线程同步,那么什么是线程同步? 线程同步 即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作 ...

  6. 【并发】线程同步——锁Lock与synchronized比较

    一.简单使用Lock锁 Java 5中引入了新的锁机制--java.util.concurrent.locks中的显式的互斥锁:Lock接口,它提供了比synchronized更加广泛的锁定操作.Lo ...

  7. Java 中线程同步锁和互斥锁

    一 概述 1.1 互斥 所谓互斥,就是不同线程,通过竞争进入临界区(共享的数据和硬件资源),为了防止访问冲突,在有限的时间内只允许其中之一独占性的使用共享资源.如不允许同时写. 1.2 同步 同步关系 ...

  8. java笔记--关于线程同步(7种同步方式)

    关于线程同步(7种方式) --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3897440.html"谢谢-- 为何要使用同步? ...

  9. Java并发编程—线程同步类

    原文作者:洲洋1984 原文地址:Java 并发包中的高级同步工具 Java 中的并发包指的是 java.util.concurrent(简称 JUC)包和其子包下的类和接口,它为 Java 的并发提 ...

最新文章

  1. 13.Django之url路由系统初探(一)
  2. python变量类型-python 变量类型 number
  3. [FlareOn5]Ultimate Minesweeper(dnSpy新玩法)
  4. [导入]编写程序实现n阶(n为奇数)魔方(C)
  5. Science子刊:喝酒脸红的人,患胃癌风险大增,他们都有同一个基因突变
  6. 信息学奥赛一本通(2044:【例5.12】回文字串)
  7. 【SimpleITK】使用区域生长法/种子填充法/形态学分割肺-CT img
  8. C语言结构体struct
  9. 风入松——北大校园的风入松书店不知何处去
  10. Codeforces Round #322 (Div. 2) A. Vasya the Hipster 水题
  11. IDC机房的网络防火墙设备
  12. auto.js制作简易音乐app(一)
  13. vmware中linux启动项,VMWare虚拟机中安装Linux系统并启用
  14. php处理微信weui图片上传
  15. 微信小程序期末大作业 记单词小程序 适合初学者学习使用
  16. 计算机最低配置有哪些,win10对电脑配置有哪些要求?win10最低配置要求
  17. 换链接,群发和伪原创何时是尽头
  18. “天地不仁,以万物为刍狗”正解
  19. 优维低代码:第三方接口接入
  20. 【项目精选】基于Java的模拟写字板的设计与实现(视频+论文+源码)

热门文章

  1. 华为4g无线路由器虚拟服务器设置方法,华为4g2pro路由器虚拟服务器设置
  2. 怎样测量地图上曲线的长度_测量长度的特殊方法
  3. vb连接mysql未发现_vb连接MySQL遇到的问题解决方法
  4. 《Python Cookbook 3rd》笔记(4.13):创建数据处理管道
  5. 《Java8实战》笔记(14):函数式编程的技巧
  6. php 单选框选中事件,html中的checkbox和radio事件选择用法详解
  7. python元胞自动机模拟交通_结构专栏 | 解析DEFORM软件中的元胞自动机法
  8. 马上有钱:揭密25种成为有钱人的方法(图)
  9. 浅谈:国内软件公司为何无法做大做强?
  10. IDEA配置jdk (SDK)