黑马程序员:Java培训、Android培训、iOS培训、.Net培训

JAVA线程-synchronized详解

一、synchronized概述

1、线程间实现互斥,必须使用同一个监视器(一个对象)

2、synchronized的作用:为同步代码块或同步方法指定监视器

3、使用同一个监视器的多块代码块或多个方法,在任何时刻,只有获得监视器的线程可访问其中的一块代码块或方法。

二、synchronized作用对象

1、synchronized语句块:需要显式指定监视器

1)生成一个对象obj,synchronized(obj){代码块}

2)synchronized(this){代码块}

3)synchronized(className.class){代码块}

2、synchronized方法:使用默认的监视器

1)实例方法,默认的监视器为:this

2)类方法,默认的监视器为:className.class(Class对象)

三、看似使用了同一个监视器,实际不是

1、使用方法体内的对象作为监视器

public void method(){

Object obj = new Object();

synchronized(obj){代码块}

}

原因:每次调用该法,都会产生新的对象obj,即新的监视器,线程间不会使用同一个监视器

解决办法:使用类的实例成员,即把“Object obj = new Object();”放到方法体外

2、使用类实例成员作为监视器需要注意两个个问题:

(1)当这个成员指向的对象发生改变时,监视器就会发生改变。例如:

String str = new String(“123”);

public synchronized(str) void method1(){……}  // method1使用监视器”123”

str = new String(“456”);

public synchronized(str) void method2(){……}  // method2使用监视器”456”

原因:使用不同的监视器,method1与method2不能同步。如果通过方法改变str的指向,则会出现令人迷惑的同步问题。

解决办法:作为监视器的类实例成员使用final声明

(2)使用类实例成员作为类方法的监视器是错误的:即实例成员不能作为类方法的监视器。

3、实例方法和类方法

public synchronized void objMethod(){ ….. }

public static synchronized void staticMethod(){……}

原因:实例方法使用的监视器是:this;而类方法使用的监视器是:className.class

解决办法:将实例方法改为如下

public synchronized(className.class) void objMethod(){ ….. }

一个问题:子线程循环10次,然后主线程循环20次,如此循环30次

技术要点:1、轮询条件

2、使用Object的wait()和notify()

技术要求:1、子线程任务:循环10次

2、主线程任务:循环20次

3、子线程任务与主线程任务存在关联(轮流运行),应当放在同一个类(类的封装设计原则之一)

4、子线程任务与主线程任务需要协作

5、子线程任务和主线程任务各执行30次

可使用阻塞队列设计思想来修改Business的代码:注意判断条件

class Business{

private boolean isSubSchudule = ture; //使用boolean变量实现线程间协作

public synchronized void sub(int loop){

while (!isSubSchudule) {  //这里可使用while替换if,避免假唤醒

try{

this.wait();

}catch(…){

…..

}

}

for(int i = 0; i < 10; i++){

System.out.println(“sub :” + i + “  loop:” + loop);

}

isSubSchudule = false;

this.notify();

}

public synchronized void main(int loop){

while (isSubSchudule){ //这里可使用while替换if,避免假唤醒

try{

this.wait();

}catch(…){

…..

}

}

for(int i = 0; i < 20; i++){

System.out.println(“main : :” + i + “  loop:” + loop);

}

isSubSchudule = ture;

this.notify();

}

}

//main()

Business business = new Business();

Thread thread = new Thread(new Runnable(){

public void run(){

for(int i = 0; i < 30; i++){business.sub(i);}}}).start();

for(int i = 0; i < 30; i++){    //将任务加入到主线程种,不用实现Runnable

business.main(i);

黑马------synchronized详解的更多相关文章

  1. Java synchronized 详解

    Java synchronized 详解 Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 1.当两个并发线程访问同一个对象object ...

  2. 剑指Offer——线程同步volatile与synchronized详解

    (转)Java面试--线程同步volatile与synchronized详解 0. 前言 面试时很可能遇到这样一个问题:使用volatile修饰int型变量i,多个线程同时进行i++操作,这样可以实现 ...

  3. synchronized详解

    关于synchronized,本文从使用方法,底层原理和锁的升级优化这几个方面来介绍. 1.synchronized的使用: synchronized可以保证在同一时刻,只有一个线程可以操作共享变量, ...

  4. JAVA 中 synchronized 详解

    看到一篇关于JAVA中synchronized的用法的详解,觉得不错遂转载之..... 原文地址: http://www.cnblogs.com/GnagWang/archive/2011/02/27 ...

  5. java并发编程(七)synchronized详解

    Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码.     一.当两个并发线程访问同一个对象object中的这个synchronized( ...

  6. java synchronized详解

    Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchronized(this ...

  7. Java中synchronized详解

    synchronized 原则: 尽量避免无谓的同步控制,同步需要系统开销,可能造成死锁 尽量减少锁的粒度 同步方法 public synchronized void printVal(int v) ...

  8. [zt]java synchronized详解

    作者:GangWang 出处:http://www.cnblogs.com/GnagWang/ 记下来,很重要. Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多 ...

  9. JAVA多线程synchronized详解

    Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 当两个并发线程访问同一个对象object中的这个synchronized(this)同 ...

随机推荐

  1. 新手使用django-pagination分页

    首先使用pip instal pagination 即可完成安装. (pycharm里就是安装个django-pagination外包) 完成后配置如下: 1. 将安装文件中的 pagination ...

  2. Xcode6如何自己添加pch文件?

    1.先自己添加.pch文件(右击new file) 2.最重要的一步,如何让工程识别! 在Build settings里搜索Prefix Header, 第一个箭头选择yes,第二箭头把你的pch的路 ...

  3. [版本管理]有惊无险修复svn服务器Invalid filesystem revision number问题

    问题起因:某一天下午,团队成员在向svn服务端提交新内容,突然整栋楼断电了,自然,提交的过程被中断了.当时,还没有什么想法. 等有电后,另外一同事在update项目时,发现无法正常使用svn,一直报异 ...

  4. 自制c#简易计算器

    这是一个课堂作业,我觉得作为一个简易的计算器不需要态度复杂的东西,可能还有一些bug,有空再慢慢加强. using System;using System.Collections.Generic;us ...

  5. 【初级】linux cp 命令详解及使用方法实战

    cp:复制文件或者目录 前言: cp命令用来复制文件或者目录,是Linux系统中最常用的命令之一.一般情况下,shell会设置一个别名,在命令行下复制文件时,如果目标文件已经存在,就会询问是否覆盖,不 ...

  6. Zend_Frameowrk中进行多语言国际化的相关的配置和使用

    在使用Zend_Framework建立网站,若网站在以后的使用中面向国际,这时就需要实现网站的多语言国际化问题.使用Zend_Framework开发的网站需要进行多语言的开发时,就需要用到了Zend_ ...

  7. cocoapods无法使用(mac os 10.11升级导致pod: command not found)

    之前安装了cocoapods, 那么输入 : sudo gem install -n /usr/local/bin cocoapods 如果还不行的话 首先在终端输入 gem sources -l 查 ...

  8. psp个人软件开发

    为开发人员提供一个PSP工具,简化时间记录工作:同时提供数据使用的工具,帮助开发人提高估算能力.  需求分析: 编号 特性 FEAT01 研发经理能够创建项目.指定或修改项目经理.删除尚未分配工作任务 ...

  9. 改变系统自带UITableViewCell的imageView的大小

    CGSize itemSize = CGSizeMake(, ); UIGraphicsBeginImageContextWithOptions(itemSize, NO,0.0); CGRect i ...

  10. #HTML:無序、有序與定義清單

    #HTML:無序.有序與定義清單 Maplewing 于 星期六, 12/10/2013 - 09:48 提交 清單在網頁中是很常使用到的東西,故多少還是要了解一下.在HTML中有三種不太一樣的清單, ...