`
woxiaoe
  • 浏览: 276703 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Java线程学习笔记(六)在其他对象上同步

    博客分类:
  • Java
阅读更多
package com.woxiaoe.study.thread;

class DualSynch{
	private Object syncObject = new Object();
	public synchronized void f(){
		for(int i = 0; i < 5; i++){
			System.out.println("f()");
			Thread.yield();
		}
	}
	public void g(){
		synchronized (this) {
			for(int i = 0; i < 5; i++){
				System.out.println("g()");
				Thread.yield();
			}
		}
	}
}
public class SyncObject {
	public static void main(String[] args) {
		final DualSynch ds = new DualSynch();
		new Thread(){
			public void run() {
				ds.f();
			};
		}.start();
		ds.g();
	}
}

 Output:

g()
g()
g()
g()
g()
f()
f()
f()
f()
f()

synchronized快必须给定一在其上进行同步的对象,并且最合理的方式是,使用其方法正在被调用的当前对象:synchronized(this),就如上面代码所示,在这种方式中,如果获得了synchronized快上的锁,那么该对象其他的synchronized方法和临界区就不能被调用了.就如上面的代码,因为g()中位对当前对象(this)同步,所以f()方法要等到其执行往后再执行。

如果我们把this改为syncObject 那么这是的输出就为:

g()
f()
g()
f()
g()
f()
g()
f()
g()
f()
即二者同时运行。这种方式必须确保所有相关的任务都是在同一个对象上同步的。

 

1
0
分享到:
评论
1 楼 wuzhihui001 2012-01-06  
11.    public void g(){  
12.        synchronized (this) {  
13.            for(int i = 0; i < 5; i++){  
14.                System.out.println("g()");  
15.                Thread.yield();  
16.            }  
17.        }  
18.    }  
19.} 


根据输出结果: 12行同步的不应该是同步对象自己  应该改成  synchronized (syncObject)

相关推荐

    java多线程笔记

    Java线程:概念与原理 2 一、操作系统中线程和进程的概念 2 二、Java中的线程 3 三、Java中关于线程的名词解释 3 四、线程的状态转换和生命周期 4 Java线程:创建与启动 7 Java线程:线程名称的设定及获取 10 Java...

    Java分布式应用学习笔记05多线程下的并发同步器

    Java分布式应用学习笔记05多线程下的并发同步器

    Java分布式应用学习笔记03JVM对线程的资源同步和交互机制

    Java分布式应用学习笔记03JVM对线程的资源同步和交互机制

    Java多线程学习笔记

    线程的基本概念 线程的创建和启动 线程的调度和优先级 线程的状态控制 线程同步

    java分布式应用学习笔记05多线程下的并发同步器.pdf

    java分布式应用学习笔记05多线程下的并发同步器.pdf

    Java中线程同步和线程协作学习笔记

    java核心技术-多线程的概念及多线程单例设计模式的应用-懒汉模式、饿汉模式、优化懒汉

    Java多线程详解(超详细)_狂神说笔记完整版_项目代码_适合小白随课程学习

    学习目录:1. 线程简介 2. 线程实现(重点) 3. 线程状态 4. 线程同步(重点) 5. 线程通信问题 6. 高级主题

    Java 学习笔记极其详细版(包括一些个人色彩不仅仅是纯笔记)

    本Jva(Java)学习笔记是一份深入且详尽的教程,不仅包括Java的基础知识,还融入了作者的个人见解和实际编程经验。内容涵盖: Java基础:数据类型、控制流、异常处理。 面向对象编程:类与对象、继承、多态、封装。...

    Java并发编程(学习笔记).xmind

    线程安全的对象在其内部实现同步,因此多个接口可以通过公有接口来进行访问 保护对象:被保护的对象只能通过特定的锁来访问 将对象封装到线程安全对象中 由特定锁保护 保护对象的方法 对象的...

    JUC多线程学习个人笔记

    JUC(Java Util Concurrent)是Java中用于并发编程的工具包,提供了一组接口和类,用于处理多线程和并发操作。JUC提供了一些常用的并发编程模式和工具,如线程池、并发集合、原子操作等。 JUC的主要特点包括: ...

    java struts2学习笔记之线程安全

    主要为大家详细介绍了java struts2学习笔记之线程安全,感兴趣的朋友可以参考一下

    Java开发详解.zip

    000000_【课程介绍 —— 写在前面的话】_Java学习概述笔记.pdf 010101_【第1章:JAVA概述及开发环境搭建】_JAVA发展概述笔记.pdf 010102_【第1章:JAVA概述及开发环境搭建】_Java开发环境搭建笔记.pdf 010201_【第2...

    juc:Java多线程学习笔记源码部分

    进程是一个独立的运行环境,而线程是在进程中执行的一个任务。他们两个本质的区别是是否单独占有内存地址空间及其它系统资源(比如I/O)。 进程单独占有一定的内存地址空间,所以进程间存在内存隔离,数据是分开的,...

    net学习笔记及其他代码应用

    1. 简述 private、 protected、 public、 internal 修饰符的访问权限。 答 . private : 私有成员, 在类的内部才可以访问。...47.当一个线程进入一个对象的一个synchronized方法后,其它线程是否可...

    Java学习笔记-个人整理的

    {10.2}其他Java相关}{146}{section.10.2} {11}项目}{148}{chapter.11} {11.1}ELTS}{148}{section.11.1} {12}Oracle数据库}{151}{chapter.12} {12.1}术语}{151}{section.12.1} {12.2}登录数据库}{151}{section....

    多线程多线程.xmind

    该文档是笔者在学习李刚老师《Java疯狂讲义》中有关多线程的用法而总结出来的笔记,其中主要的内容包括线程创建和启动、线程的生命周期、控制线程、线程同步、线程通信线程池等基本内容。对Java多线程有详细的介绍。

    整理后java开发全套达内学习笔记(含练习)

    Thread [java] 线程 [θred] throw (关键字) throws (关键字) [θrәu] 抛出(异常) transient (关键字) 瞬变;临时的['trænziәnt]'(可序列化) valid 正确的,有效的 ['vælid] variable n.变量 a.可变的['vєә...

    java学习笔记包括基本语法和高级语法

    基于java的基础知识,进行归纳的文件,包括基本语法和高级语法,如:5 线程 同步异步 Lambda,7 函数式接口 stream流 反射等。以及部分案例

    多线程多线程.zip

    该文档是笔者在学习李刚老师《Java疯狂讲义》中有关多线程的用法而总结出来的笔记,其中主要的内容包括线程创建和启动、线程的生命周期、控制线程、线程同步、线程通信线程池等基本内容。对Java多线程有详细的介绍。...

Global site tag (gtag.js) - Google Analytics