【原创】对Java的synchronized关键字的学习
在Java中,每一个线程都有一个内部锁。当我们使用synchronized关键字时,就是利用这个内部锁来实现线程对某个对象的锁定控制。
那么,如果某个对象中有两个方法,方法一和方法二都使用了synchronized关键字。如果线程一执行该对象的方法一,线程二执行该对象的方法二。如果线程1一直不释放该对象的内部锁的话,那么线程二应该无法执行该对象的方法二。下面就用代码来验证一下。
首先,定义一个Task类。
package corejava.chapter14;
public class TaskC {
public synchronized void method1() throws InterruptedException {
while (true) {
System.out.println("我是方法1");
Thread.sleep(10000);
}
}
public synchronized void method2() throws InterruptedException {
while (true) {
System.out.println("我是方法2");
Thread.sleep(10000);
}
}
}
method1每隔10秒就会输出一句“我是方法1”。method2每隔10秒就会输出一句“我是方法2”。两个方法都使用了synchronized关键字。
再定义两个执行类ExecutorC1和Executor2。
package corejava.chapter14;
public class ExecutorC1 implements Runnable {
private TaskC taskC;
public ExecutorC1(TaskC taskC) {
this.taskC = taskC;
}
@Override
public void run() {
try {
taskC.method1();
} catch (Exception e) {
e.printStackTrace();
}
}
}
package corejava.chapter14;
public class ExecutorC2 implements Runnable {
private TaskC taskC;
public ExecutorC2(TaskC taskC) {
this.taskC = taskC;
}
@Override
public void run() {
try {
taskC.method2();
} catch (Exception e) {
e.printStackTrace();
}
}
}
执行类1启动线程后,会执行taskC的method1方法。执行类启动线程后,会执行taskC的method2方法。
最后定义入口类Main
package corejava.chapter14;
public class Main {
public static void main(String[] args) {
TaskC taskC = new TaskC();
ExecutorC1 executorC1 = new ExecutorC1(taskC);
ExecutorC2 executorC2 = new ExecutorC2(taskC);
Thread thread1 = new Thread(executorC1);
Thread thread2 = new Thread(executorC2);
thread1.start();
thread2.start();
}
}
执行对象1和执行对象2都使用同一个taskC去实例化,这样他们之间就会存在竞争。当thread1执行taskC的method1时,会一直持有taskC的内部锁,因此thread2将一直处于阻塞状态。
下面是运行输出结果

可见,确实如我们所料,虽然两个线程要执行的是不同的方法,但因为线程1一直“霸占”着内部锁,所以线程2始终在阻塞状态,得不到执行。
所以,如果我们在对某个类要使用synchronized关键字进行锁定控制时,一定要牢记它使用的是该类的内部锁。它是唯一的。当多个方法都用它来进行控制时,一定要考虑这一点。
【原创】对Java的synchronized关键字的学习的更多相关文章
- Java 多线程 —— synchronized关键字
java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...
- Java的synchronized关键字:同步机制总结
JAVA中synchronized关键字能够作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块.搞清楚synchronized锁定的是哪个对象,就能帮助我们设计更安全的多线程程 ...
- java中synchronized关键字分析
今天我们来分析一下java中synchronized关键字.首先来看一段java代码:(本地编译环境为mac,jdk1.8的环境) Demo.java package com.example.spri ...
- Java基础-synchronized关键字的用法(转载)
synchronized--同步 顾名思义是用于同步互斥的作用的. 这里精简的记一下它的使用方法以及意义: 当synchronized修饰 this或者非静态方法或者是一个实例的时候,所同步的锁是加在 ...
- 从分布式锁角度理解Java的synchronized关键字
分布式锁 分布式锁就以zookeeper为例,zookeeper是一个分布式系统的协调器,我们将其理解为一个文件系统,可以在zookeeper服务器中创建或删除文件夹或文件.设D为一个数据系统,不具备 ...
- java基础Synchronized关键字之对象锁
java中Synchronized关键字之对象锁 当有多个线程对一个共享数据进行操作时,需要注意多线程的安全问题. 多线程的同步机制对资源进行加锁,使得在同一个时间,只有一个线程可以进行操作,同 ...
- Java 多线程 - Synchronized关键字
目录 1-Synchronized 关键字概述 2- Synchronized关键字作用域 3- Synchronized 原理(反编译指令解释) 正文 1-Synchronized 关键字概述 由于 ...
- java中synchronized关键字的用法
在java编程中,经常需要用到同步,而用得最多的也许是synchronized关键字了,下面看看这个关键字的用法. 因为synchronized关键字涉及到锁的概念,所以先来了解一些相关的锁知识. j ...
- Java Concurrency - synchronized 关键字
当有多个线程竞争共享资源时,对资源的访问顺序敏感,则可能造成数据不一致.为了保证共享资源不被多个线程同时访问,则需要将竞争共享资源的代码置于临界区,临界区保证在同一时间内最多只能有一个线程执行该代码段 ...
随机推荐
- Android RecyclerView完全解析
RecyclerView完全解析 (一) 前言 话说RecyclerView已经面市很久,也在很多应用中得到广泛的使用,在整个开发者圈子里面也拥有很不错的口碑,那说明RecyclerView拥有比Li ...
- 一起来玩echarts系列(二)------echarts图表自适应问题
为了直观查看公司服务器各个进程占用的内存动态情况,我使用echarts进行数据可视化,具体的实现过程按下不表. 最后实现的效果如图: 然后问题就来了,因UI采用了Bootstrap响应式框架,所以除了 ...
- 爱上PowerShell
Shell带来的好处是毋庸置疑的,当然也需要大量的时间去练习.PowerShell作为后起之秀, 同时试图打造一款更加人性化,更加易用的Shell.随着PowerShell开源跨平台的战略以及在Win ...
- linux:C语言通过ICMP协议判断局域网内部主机是否存活
ICMP协议 ICMP(Internet Control Message,网际控制报文协议)是为网关和目标主机而提供的一种差错控制机制,使它们在遇到差错时能把错误报告给报文源发方. ICMP协议是IP ...
- 办理英属哥伦比亚大学(本科)学历认证『微信171922772』UBC学位证成绩单使馆认证University of British Columbia
办理英属哥伦比亚大学(本科)学历认证『微信171922772』UBC学位证成绩单使馆认证University of British Columbia Q.微信:171922772办理教育部国外学历学位 ...
- neovim的新体验
A. 缘由 vim下的CtrlP插件好用,但是当文件较多时,不能很快检索,时有卡死的情况发生.听说neovim引入了很多新的功能,例如异步处理,job管理等. B. 安装neovim1. Ubunt ...
- 关于Kafka使用IBM Java报错解决方案
安装环境 Ubuntu 14.04 Java IBM Java 1.7.0_79 Kakfa 2.10-0.8.2.1 使用bin/kafka-server-start.sh config/serve ...
- DUIlib使用Fastreport--自定义的数据
报表根据数据源的可以分为拉模式和推模式,拉模式就是在报表中添加数据源组件从数据库中拉取数据,我们上篇报表的简单使用就是拉模式.而推模式就是在程序中构造数据托给报表显示.这篇我们这要说的是推模式. 在程 ...
- CentOS 7.2 部署Saltstack
CentOS 7.2部署Saltstack 一.环境介绍: 服务器名称 IP地址 Salt-Master 192.168.30.141 Slave1 192.168.30.131 Slave2 192 ...
- 微信小程序推荐
工具类 快递100助手:查快递,寄快递. 驾考帮手:为您提供科目一.科目四的测试题练习. 翻译e:多国语言在线翻译,中英.中日.中俄.中法快速翻译,专业翻译. 朝夕日历Pro:一个日历管理 app,你 ...