`

jdk1.5——多线程操作同一资源(互斥各种写法)

 
阅读更多

 

 

 0 代码案例:

 

package thread;

public class SynchronizedThread {

	/**
	 * 利用打印姓名方法    测试多线程并发执行出现的问题
	 * 多线程下操作同一资源,如果不带锁下,必定出现争抢资源而结果显示异常错误,
	 * 
	 * 任何对象都可以当做是一个门栓,如果要保持同步锁,那么门栓也要是同一个
	 */
	public static void main(String[] args) {
		//final Outputer outputer = new Outputer();
		//final Outputer1 outputer = new Outputer1();
		final Outputer2 outputer = new Outputer2();
		
		Thread thread1 = new Thread(new Runnable(){
			@Override
			public void run() {
				while(true){
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					outputer.out("zhong guo ren");
				}
			}
		});
		thread1.start();
		
		
		Thread thread2 = new Thread(new Runnable(){
			@Override
			public void run() {
				while(true){
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					outputer.out("jieta car");
				}
			}
		});
		thread2.start();
		
		
		
		
	}

}

// 下面写法是表达  一定要找出 那个共同的门栓 ,这才是 多线程下达到同步的 要点,至于是同步放在方法头上 还是放在方法体中,没有很大区别!!!!!


// 没有门栓下 多线程操作统一资源  出现打印名称错乱现象
class Outputer {
	public void out(String name) {
			int len = name.length();
			for(int i=0;i<len;i++){
				System.out.print(name.charAt(i));
			}
			System.out.println();
	}
}

// 如下是同步代码块的两种写法

class Outputer1 {
	String lock = "lock"; // 借助于第三方变量 来作为门栓
	public void out(String name) {
		synchronized (lock) {
			int len = name.length();
			for(int i=0;i<len;i++){
				System.out.print(name.charAt(i));
			}
			System.out.println();
		}
	}
}

class Outputer2 {
	 // 借助于调用者对象 来作为门栓  前提是调用者必须是同一个对象
	public void out(String name) {
		synchronized (this) { 
			int len = name.length();
			for(int i=0;i<len;i++){
				System.out.print(name.charAt(i));
			}
			System.out.println();
		}
	}
}

// 如下是同步方法写法
class Outputer3 {
	 // 同步方法下,门栓是调用方法out的类Outputer3的对象,为了保证同步生效,必须确保不同线程调用此方法的类实例是同一个    
	//  此写法和 Outputer2的写法 是同样的效果
	public synchronized void  out(String name) {
		int len = name.length();
		for(int i=0;i<len;i++){
			System.out.print(name.charAt(i));
		}
		System.out.println();
	}
}

// 如果 out方法是静态方法的话,那么同步代码块的门栓应该是 类对象
class Outputer4 {
	 // 同步方法下,门栓是调用方法out的类Outputer3的对象,为了保证同步生效,必须确保不同线程调用此方法的类实例是同一个    
	//  此写法和 Outputer2的写法 是同样的效果
	public synchronized  static void  out(String name) {
		int len = name.length();
		for(int i=0;i<len;i++){
			System.out.print(name.charAt(i));
		}
		System.out.println();
	}
	
	 // 在方法头上加同步 同时方法是static的 那么门栓只能是这个方法所在类的类字节码:  !!!!!!!!!!!!!
	/*public void out(String name) {
		synchronized (Outputer4.class) { 
			int len = name.length();
			for(int i=0;i<len;i++){
				System.out.print(name.charAt(i));
			}
			System.out.println();
		}
	}*/
}



 

 

1 脑图:

 

 



 

 

 

 

  • 大小: 28.1 KB
分享到:
评论

相关推荐

    jdk1.5 windows版本 64位

    标题:“jdk1.5 windows版本 64位” 描述:“jdk1.5 windows版本 64位,Java开发依赖环境” 标签:“windows” 在这个主题中,我们聚焦的是Oracle JDK 1.5(也被称为Java Development Kit,简称JDK)在Windows...

    jdk1.5x64位 windows版.zip

    在并发编程方面,JDK1.5引入了并发工具类(java.util.concurrent),包括Semaphore、CyclicBarrier、CountDownLatch等,这些工具极大地简化了多线程编程中的同步和协调。 在内存模型和并发性能上,JDK1.5引入了Java...

    linux系统jdk1.5下载

    Linux系统中的JDK1.5是Java开发工具包的一个早期版本,主要针对Java语言的编译、运行和调试提供支持。这个版本在今天已经相对较为罕见,因为Java已经有了多个后续版本,包括JDK7、JDK8、JDK9直至最新的JDK17等。然而...

    Java-jdk1.5安装包

    在JDK1.5之前,将基本类型与对应的包装类进行转换需要手动操作。Java 5.0引入了自动装箱和拆箱,使得这种转换更加便捷。例如,int和Integer之间的转换可以自动完成,简化了代码。 五、增强的for循环(Enhanced For ...

    jdk1.5免安装版

    绝版jdk1.5,非常不错的资源。用起来很好。是 Java语言对Bean类属性、事件的一种缺省处理方法。例如类A中有属性name,那我们可以通过getName,setName来得到其值或者设置新 的值。通过getName/setName来访问name属性,...

    简单易用通用(xls,xlsx)导入导出操作 jdk1.5+

    前几天上传过这个资源,因为是在jdk1.6上开发的, 测试了一下在jdk1.5上不能用, 今天重新用jdk1.5编译了一下, 这个是可以支持jdk1.5+的 将 pu-xlscommon-1.0.0.jar 添加到工程的 /lib 目录下 用法在附件中 XlsTest....

    jdk1.5.exe jdk1.5

    jdk1.5.exe jdk1.5 jdk1.5下载

    IBM_jdk1.5_Guide.zip_IBM jdk 1.5_aix_ibm java1.5_ibm jdk1.5 wind

    7. **多线程支持**:AIX操作系统是多用户、多任务的,因此IBM JDK 1.5在多线程编程方面有出色的表现,能够高效地管理和调度多个并发执行的线程。 8. **平台兼容性**:IBM JDK 1.5是针对AIX操作系统设计的,这意味着...

    包含 jdk1.5免安装、jdk1.6免安装、jdk1.8(32和64)

    1. **Lambda表达式**:允许以简洁的方式表示匿名函数,极大地简化了多线程和函数式编程。 2. **函数式接口**:如`java.util.Function`,`java.util.Consumer`,为lambda表达式提供接口支持。 3. **Stream API**:...

    JDK1.5,JDK1.5

    JDK1.5,全称Java Development Kit 1.5,是Java平台标准版(Java SE)的一个重要版本,由Sun Microsystems在2004年9月30日正式发布。这个版本引入了大量的新特性,对Java编程语言进行了重大改进,极大地提升了开发...

    window JDK1.5 32位 绿色免安装版,可以安装多个JDK使用

    标题中的"window JDK1.5 32位 绿色免安装版"指的是适用于Windows操作系统的32位版本的JDK 1.5,它是一个便携式版本,无需正式安装即可使用。这种绿色免安装版通常是为了方便开发者在不同机器间快速切换工作环境,或...

    详细介绍JDK1.5的各种新特性

    8. **NIO.2(New I/O 2)**:虽然NIO(非阻塞I/O)是在JDK1.4引入的,但JDK1.5对其进行了扩展,添加了文件系统操作和文件观察者等功能,使得文件操作更加高效和灵活。 9. **类型安全的异常检查(Checked Exceptions...

    jdk 1.5 线程的使用,简单例子

    通过接口java.util.concurrent.Callable 的使用 实现线程的启用,程序为一个main的例子,可以直接运行(jdk1.5 以上版本)

    jdk 1.5 linux (共三个文件)之一

    测试可用的linux版jdk1.5,jdk-1_5_0_19-linux-i586-rpm.bin

    JDK1.5最终版全平台下载

    JDK1.5 全平台安装包下载 百度网盘资源 jdk-1_5_0_22-linux-amd64-rpm.bin jdk-1_5_0_22-linux-amd64.bin jdk-1_5_0_22-linux-i586-rpm.bin jdk-1_5_0_22-linux-i586.bin jdk-1_5_0_22-solaris-amd64...

    IBMJDK1.5linux.zip

    在压缩包"IBMJDK1.5linux.zip"中,主要包含的是IBM JDK 1.5的安装文件和相关文档。安装完成后,开发者可以通过设置环境变量(如JAVA_HOME、PATH)来使用这个JDK。通常,这个JDK会包含Java编译器(javac)、Java解释...

    jdk1.5 windows 64位官方正式版,绝对有效

    对于并发编程,JDK1.5引入了java.util.concurrent包,其中包括了线程池、Future、Callable接口以及CyclicBarrier和Semaphore等同步工具类,极大地丰富了并发处理能力,提升了多线程环境下的性能和可维护性。...

    linux下JDK1.5

    1. **下载**:你需要从Oracle官方网站或者第三方镜像站点下载适用于Linux操作系统的JDK1.5安装包。文件名为`linx_jdk1.5`可能就是这个安装包的名称。 2. **解压**:使用`tar`命令来解压下载的文件。例如,如果`linx...

    历史版本JDK1.5安装包

    8. 遗留的和已删除的特性:JDK 1.5还移除了一些过时的API,如Vector和Hashtable,鼓励开发者使用更加线程安全的ArrayList和HashMap。 9. 类依赖性管理:通过引入ServiceLoader,可以方便地加载实现特定接口的类,...

    JDK1.5、JDK5下载

    在下载JDK1.5或JDK5时,你需要确保选择与你的操作系统兼容的版本,即32位或64位。同时,如果你遇到无法下载或者积分不足的问题,可以尝试联系描述中提到的博主寻求帮助。安装JDK后,设置好环境变量,你就可以开始...

Global site tag (gtag.js) - Google Analytics