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 脑图:
相关推荐
包含 jdk1.5免安装、jdk1.6免安装、jdk1.8(32和64)
前几天上传过这个资源,因为是在jdk1.6上开发的, 测试了一下在jdk1.5上不能用, 今天重新用jdk1.5编译了一下, 这个是可以支持jdk1.5+的 将 pu-xlscommon-1.0.0.jar 添加到工程的 /lib 目录下 用法在附件中 XlsTest....
jdk1.5.exe jdk1.5 jdk1.5下载
绝版jdk1.5,非常不错的资源。用起来很好。是 Java语言对Bean类属性、事件的一种缺省处理方法。例如类A中有属性name,那我们可以通过getName,setName来得到其值或者设置新 的值。通过getName/setName来访问name属性,...
JDK1.5,JDK1.5
通过接口java.util.concurrent.Callable 的使用 实现线程的启用,程序为一个main的例子,可以直接运行(jdk1.5 以上版本)
测试可用的linux版jdk1.5,jdk-1_5_0_19-linux-i586-rpm.bin
jdk1.5.0.22 是jdk1.5的最后一版,jdk1.5 windows 64位官方正式版,绝对有效,jdk1.5 windows 64位官方正式版,绝对有效
“JDK1.5”(开发代号猛虎)的一个重要主题就是通过新增一些特性来简化开发,这些特性包括泛型,for-else 循环,自动装包/拆包,枚举,可变参数, 静态导入
jdk 1.5 中文 api chm jdk 1.5 中文 api chm
jdk1.5.0.22 是jdk1.5的最后一版
JDK1.5 API完整版JDK1.5 API完整版JDK1.5 API完整版
很实用的JAVA API中文参考文档,如果你开始讨厌HTML版本的API中文文档,试试这个吧,强大的索引功能使你开发更加愉快,分两卷,要都下了才能解压。
详细介绍java对象的使用和说明详细介绍java对象的使用和说明详细介绍java对象的使用和说明详细介绍java对象的使用和说明详细介绍java对象的使用和说明
Jdk1.5Doc_CN.chm Jdk1.5Doc_CN.chm Jdk1.5Doc_CN.chm Jdk1.5Doc_CN.chm
jdk1.5压缩包 解压缩可用 用于Windows系统
JDK1.5+1.6整合版(文件为txt文件,里面有百度网盘下载地址<文件太大所以用网盘>) 文件里含有1.5和1.6两个版本的JDK,并且附有一环境变量创建办法以及切换版本方法
现在有些资源需要使用JDK1.5 ,并且官网已经不可下载,故上传该版本
Java-jdk1.5安装包
转载 jdk1.5的一些新特性,希望能帮助大家!