在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关键字进行锁定控制时,一定要牢记它使用的是该类的内部锁。它是唯一的。当多个方法都用它来进行控制时,一定要考虑这一点。

最新文章

  1. PHP【函数】
  2. mybatis实战教程(mybatis in action)之九:mybatis 代码生成工具的使用
  3. 在stream流和byte[]中查找(搜索)指定字符串
  4. 洛谷 P1462 通往奥格瑞玛的道路 Label: 最小化最大值 && spfa (存多条边示例)
  5. fw:理解RESTful架构
  6. Openstack REST API
  7. 【小练习04】HTML+CSS--医药健康小页面
  8. HAUTOJ 1283 YK的书架
  9. MT6592 经验积累
  10. kubernetes集群网络配置方案
  11. IDEA 远程调试 Tomcat 和 Debugger
  12. Darknet windows移植(YOLO v2)
  13. rabbitmq的相关知识
  14. 多重条件判断SQL:用于用户名称,密码,权限的检测和判断
  15. 各大OJ题目分类
  16. 匿名函数、闭包、lambda表达式、Block
  17. python基础之递归、二分法
  18. BloomFilter–大规模数据处理利器
  19. jQuery的event事件
  20. Cheatsheet: 2018 01.01 ~ 02.28

热门文章

  1. VS2013提示error C4996: 'strcat': This function or variable may be unsafe. Consider using strcat_s instead.
  2. jQuery2.x源码解析(DOM操作篇)
  3. Windows Form简易计算器实现(下)
  4. 【游记】NOIP2015造纸记
  5. C# 语言规范_版本5.0 (第19章 附录A_文档注释)
  6. java zip 批量打包(java.util包和apache.tools包)
  7. attr 和 prop 区别
  8. Java 后台sql注入
  9. 面试经典——从输入 URL 到页面加载完的过程中都发生了什么事情?
  10. 使用rsync无密码传输