在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关键字的学习的更多相关文章

  1. Java 多线程 —— synchronized关键字

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

  2. Java的synchronized关键字:同步机制总结

    JAVA中synchronized关键字能够作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块.搞清楚synchronized锁定的是哪个对象,就能帮助我们设计更安全的多线程程 ...

  3. java中synchronized关键字分析

    今天我们来分析一下java中synchronized关键字.首先来看一段java代码:(本地编译环境为mac,jdk1.8的环境) Demo.java package com.example.spri ...

  4. Java基础-synchronized关键字的用法(转载)

    synchronized--同步 顾名思义是用于同步互斥的作用的. 这里精简的记一下它的使用方法以及意义: 当synchronized修饰 this或者非静态方法或者是一个实例的时候,所同步的锁是加在 ...

  5. 从分布式锁角度理解Java的synchronized关键字

    分布式锁 分布式锁就以zookeeper为例,zookeeper是一个分布式系统的协调器,我们将其理解为一个文件系统,可以在zookeeper服务器中创建或删除文件夹或文件.设D为一个数据系统,不具备 ...

  6. java基础Synchronized关键字之对象锁

    java中Synchronized关键字之对象锁    当有多个线程对一个共享数据进行操作时,需要注意多线程的安全问题. 多线程的同步机制对资源进行加锁,使得在同一个时间,只有一个线程可以进行操作,同 ...

  7. Java 多线程 - Synchronized关键字

    目录 1-Synchronized 关键字概述 2- Synchronized关键字作用域 3- Synchronized 原理(反编译指令解释) 正文 1-Synchronized 关键字概述 由于 ...

  8. java中synchronized关键字的用法

    在java编程中,经常需要用到同步,而用得最多的也许是synchronized关键字了,下面看看这个关键字的用法. 因为synchronized关键字涉及到锁的概念,所以先来了解一些相关的锁知识. j ...

  9. Java Concurrency - synchronized 关键字

    当有多个线程竞争共享资源时,对资源的访问顺序敏感,则可能造成数据不一致.为了保证共享资源不被多个线程同时访问,则需要将竞争共享资源的代码置于临界区,临界区保证在同一时间内最多只能有一个线程执行该代码段 ...

随机推荐

  1. Oracle层次查询和with函数的使用

    开发中大家应该都做过什么类似部门管理这样的功能,一般情况下一个部门下面还有下一级部门(子部门),这个层级就类似一棵树.这种情况下一般会把父级部门和子级部门分成2个或者多个表,这种算是比较常规的做法:有 ...

  2. Android开发(30)--AutoCompleteTextView和MultiAutoCompleteTextView自动提示输入内容

    首先大家都见过类似这种效果, AutoCompleteTextView是实现动态匹配输入的内容 下面就通过一个实例来说明AutoCompleteTextView,同样,AutoCompleteText ...

  3. iOS 指南针的制作 附带源码

    iOS  指南针的制作  附带源码 代码下载地址: http://vdisk.weibo.com/s/HK4yE   http://pan.baidu.com/share/link?shareid=7 ...

  4. 文件对话框WPF(5)----文件浏览对话框

    废话就不多说了,开始... WPF中文件浏览对话框的实现可以利用Windows API Code Pack,它是一个用于访问Windows Vista/7 特性的托管代码函数库,但并没有包含在.NET ...

  5. 利刃 MVVMLight 1:MVVMLight介绍以及在项目中的使用

    一.MVVM 和 MVVMLight介绍 MVVM是Model-View-ViewModel的简写.类似于目前比较流行的MVC.MVP设计模式,主要目的是为了分离视图(View)和模型(Model)的 ...

  6. js处理层级数据结构的一些总结

    开发者对复杂的数据结构的处理能力也是体现开发者水平的一个度量吧...最近发现自己对一些嵌套数据结构.层级数据结构的处理能力不大足...经常被这些把自己绕晕...严重影响开发效率...就稍微低总结了一下 ...

  7. 微信小程序前置课程:flex布局(二)

    原文:http://www.ruanyifeng.com/blog/2015/07/flex-examples.html 上一篇文章介绍了Flex布局的语法,今天介绍常见布局的Flex写法. 你会看到 ...

  8. find指令参数

    1.name ~ 根目录 . 当前和子目录 name之后跟的是文件名 find . -name "[a-z]*[4-9].log" -print 2.perm perm后面跟的是权 ...

  9. bootstrap IE8 相互兼容

    针对 IE8 仍然需要额外引入 Respond.js 文件(由于仍然利用了浏览器对媒体查询(media query)的支持,因此还需要做处理) <html lang="zh-cn&qu ...

  10. hibernate内部测试题总结

    在Hibernate中,关于脏检查和刷新缓存说法正确的是(ab ). A.当事务提交时,会发生脏检查 B.Session的flush( )方法是刷新缓存的方法 C.在执行Session的commit( ...