同步方法容易造成死循环。

package com.cky.bean;

/**
* Created by edison on 2017/12/8.
*/
public class Service { synchronized public void methodA(){
System.out.println("methodA begin");
boolean isContinueRun = true;
while (isContinueRun) { }
System.out.println("methodA end");
} synchronized public void methodB(){
System.out.println("methodB begin");
System.out.println("methodB end");
} }
package com.cky.thread;

import com.cky.bean.Service;

/**
* Created by edison on 2017/12/8.
*/
public class ThreadA extends Thread{
private Service service; public ThreadA(Service service) {
this.service = service;
} @Override
public void run() {
super.run();
service.methodA();
}
}
package com.cky.thread;

import com.cky.bean.Service;

/**
* Created by edison on 2017/12/8.
*/
public class ThreadB extends Thread{ private Service service; public ThreadB(Service service) {
this.service = service;
} @Override
public void run() {
super.run();
service.methodB();
}
}
package com.cky.test;

import com.cky.bean.Service;
import com.cky.thread.ThreadA;
import com.cky.thread.ThreadB; /**
* Created by edison on 2017/12/8.
*/
public class Test {
public static void main(String[] args) {
Service service = new Service();
ThreadA threadA = new ThreadA(service);
threadA.setName("a");
threadA.start();
ThreadB threadB = new ThreadB(service);
threadB.setName("b");
threadB.start(); }
}
methodA begin

Process finished with exit code 1

结果运行:

线程B永远得不到运行的机会,锁死了。

这时可以使用同步代码块来解决这样的问题

更改Service.java文件代码

package com.cky.bean;

/**
* Created by edison on 2017/12/8.
*/
public class Service { Object object1 = new Object();
public void methodA(){
synchronized (object1) {
System.out.println("methodA begin");
boolean isContinueRun = true;
while (isContinueRun) { }
System.out.println("methodA end");
} }
Object object2 = new Object();
public void methodB(){
synchronized (object2) {
System.out.println("methodB begin");
System.out.println("methodB end");
} } }
methodA begin
methodB begin
methodB end

运行结果不再出现同步等待的情况。

2.2.11同步synchronized方法无限等待与解决的更多相关文章

  1. 2.2.9静态同步synchronized方法与synchronized(class)代码块

    关键字synchronized还可以应用在static静态方法上,这样写那是对当前的*.java文件对应的class类进行持锁, 测试如下 package com.cky.bean; /** * Cr ...

  2. java 多线程:Thread 并发线程: 方法同步synchronized关键字,与static的结合

    1.方法内的变量是安全的 方法内定义的变量,每个变量对应单独的内存变量地址,多个线程之间相互不影响.多个线程之间的变量根本没有一毛钱关系 public class ThreadFuncVarSafe ...

  3. 深入理解synchronized方法同步的是方法还是对象?

    一.运用synchronized关键字 首先我们来看看一个多线程中线程不安全的列子 代码如下: 共享数据类: public class NotSynchronizated extends Thread ...

  4. 【Java面试题】26 多线程有几种实现方法?同步有几种实现方法? 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

    问题一:多线程有几种实现方法?同步有几种实现方法? 多线程有两种实现方法,分别是继承Thread类与实现Runnable接口   同步的实现方面有两种,分别是synchronized,wait与not ...

  5. 转:Java同步synchronized使用

    原文链接 作者:Jakob Jenkov Java 同步块(synchronized block)用来标记方法或者代码块是同步的.Java同步块用来避免竞争.本文介绍以下内容: Java同步关键字(s ...

  6. 015-线程同步-synchronized几种加锁方式、Java对象头和Monitor、Mutex Lock、JDK1.6对synchronized锁的优化实现

    一.synchronized概述基本使用 为确保共享变量不会出现并发问题,通常会对修改共享变量的代码块用synchronized加锁,确保同一时刻只有一个线程在修改共享变量,从而避免并发问题. syn ...

  7. java中同步(synchronized)详解

    一.开山篇: 1.synchronized的使用 一个程序中,如果该类中的代码可能运行于多线程环境下,那么就要考虑同步的问题.在Java中内置了语言级的同步原语--synchronized,这也大大简 ...

  8. java ->多线程_线程同步、死锁、等待唤醒机制

    线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. l  我们通过一个案例,演示线 ...

  9. Java多线程同步 synchronized 关键字的使用

    代表这个方法加锁,相当于不管哪一个线程A每次运行到这个方法时,都要检查有没有其它正在用这个方法的线程B(或者C D等),有的话要等正在使用这个方法的线程B(或者C D)运行完这个方法后再运行此线程A, ...

随机推荐

  1. Django中反向生成models

    我们在展示django ORM反向生成之前,我们先说一下怎么样正向生成代码. 正向生成,指的是先创建model.py文件,然后通过django内置的编译器,在数据库如mysql中创建出符合model. ...

  2. C语言的那些事

    变量的存数类型: 1:静态变量:凡是在代码任何快之外声明的变量总是存储在静态内存内,也就是不属于堆栈的内存. 对于这类变量.你无法对它们制指定存储类型. 2:存储于堆栈中,称为自动变量.当程序执行到声 ...

  3. 关于PHP程序员技术职业生涯规划 2017年3月5日韩 天峰

    看到很多PHP程序员职业规划的文章,都是直接上来就提Linux.PHP.MySQL.Nginx.Redis.Memcache.jQuery这些,然后就直接上手搭环境.做项目,中级就是学习各种PHP框架 ...

  4. js sort

    排序算法 比较的过程必须通过函数抽象出来.通常规定,对于两个元素x和y,如果认为x < y,则返回-1,如果认为x == y,则返回0,如果认为x > y,则返回1,这样,排序算法就不用关 ...

  5. mybatis进阶--输入映射和输出映射

    我们知道,mapper.xml是我们配置操作数据库的sql语句的地方.其中每个sql语句对应着一个方法,每个方法都有自己的输入输出参数类型.那么这些类型都是怎么配置的呢?今天我们来一起学习下. 输入映 ...

  6. angular2.0学习笔记1.开发环境搭建 (node.js和npm的安装)

    开发环境, 1.安装Node.js®和npm, node 6.9.x 和 npm 3.x.x 以上的版本. 更老的版本可能会出现错误,更新的版本则没问题. 控制台窗口中运行命令 node -v 和 n ...

  7. Centos7 开机启动命令行模式

    1.在图形界面下单击鼠标右键,选择“Konsole”: 2. 获取当前系统启动模式,输入:systemctl get-default 3.查看配置文件, cat /etc/inittab 4.通过以上 ...

  8. N! (数组)

    #include <iostream> using namespace std; ; int f[MAXN]; int main(){ int n; cin >> n; f[] ...

  9. iOS.CocoaPods.0

    1. CocoaPods CocoaPods 是Objective-C (iOS and OS X) projects 的依赖管理器. A CocoaPod (singular) is a speci ...

  10. RNA测序研究现状与发展

    RNA测序研究现状与发展 1 2,584 A+ 所属分类:Transcriptomics   收  藏 通常来说,某一个物种体内所有细胞里含有的DNA都应该是一模一样的,只是因为每一种细胞里所表达的R ...