Java并发编程之线程互斥笔记
来源:互联网 发布:百度人工智能产品 编辑:程序博客网 时间:2024/05/22 11:42
public class Client {public <span style="color:#ff0000;">static </span>void main(String[] args) {<span style="color:#ff0000;"> MyShow show=new MyShow();//这是在静态方法中(内部类有可以访问外部类的属性的性质)但是里做不到,所以错误。</span>new Thread(new Runnable() {@Overridepublic void run() {show.showInfo("test");}}).start();new Thread(new Runnable() {@Overridepublic void run() {}}).start();}class MyShow{public void showInfo(String name){for(int i=0;i<name.length();i++){System.out.print(name.charAt(i));}System.out.println();}}}
代码修改如下:
public class Client {public static void main(String[] args) { final MyShow show=new MyShow();new Thread(new Runnable() {@Overridepublic void run() {while(true){show.showInfo("code");try {Thread.sleep(500);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}).start();new Thread(new Runnable() {@Overridepublic void run() {while(true){show.showInfo("monkey");try {Thread.sleep(560);} catch (Exception e) {// TODO: handle exception}}}}).start();}
//静态内部类等同于外部类<span style="color:#ff0000;">static</span> class MyShow{public void showInfo(String name){for(int i=0;i<name.length();i++){System.out.print(name.charAt(i));}System.out.println();}}}注意:内部类可以访问外部类的成员变量,所以要先有外部类,在静态方法中没有。内部类要访问外部类的局部变量,局部变量要加final。静态内部类相当于外部类,可以有静态方法。静态方法和字节码对象关联(字节码已经加载在内存中)
运行结果:
出现错误!!!接下来要解决线程安全的问题。
在临界数据或者是易碎数据加上对象锁关键字如下:
static class MyShow{public void showInfo(String name){synchronized (this) {for(int i=0;i<name.length();i++){System.out.print(name.charAt(i));}}System.out.println();
this是该对象内部,其他地方调用就是new出来的对象。
或者一个同步方法也可以解决:
static class MyShow{//当前对象锁public synchronized void showInfo(String name){for(int i=0;i<name.length();i++){System.out.print(name.charAt(i));}System.out.println();}
本质,如果要保证线程的安全,就要做到是对同一个对象加锁。每个线程访问该对象就不会出现线程不同步的问题了。
public class Client {public static void main(String[] args) { final MyShow show=new MyShow();new Thread(new Runnable() {@Overridepublic void run() {while(true){show.showInfo("code");show.showInfo2("code");MyShow.showInfo3("code");try {Thread.sleep(500);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}).start();new Thread(new Runnable() {@Overridepublic void run() {while(true){show.showInfo("monkey");show.showInfo2("monkey");MyShow.showInfo3("monkey");try {Thread.sleep(560);} catch (Exception e) {// TODO: handle exception}}}}).start();}static class MyShow{//当前对象锁public synchronized void showInfo(String name){<span style="color:#ff0000;">synchronized(this)</span>{//出问题的地方改成<span style="font-family: Arial, Helvetica, sans-serif;"><span style="color:#ff0000;">MyShow.class即可解决</span>。</span>for(int i=0;i<name.length();i++){System.out.print(name.charAt(i));}}System.out.println();}//当前对象锁public synchronized void showInfo2(String name){for(int i=0;i<name.length();i++){System.out.print(name.charAt(i));}System.out.println();}//静态同步方法(静态方法对应字节码)<span style="color:#ff0000;">public static synchronized</span> void showInfo3(String name){for(int i=0;i<name.length();i++){System.out.print(name.charAt(i));}System.out.println();}}}
0 0
- Java并发编程之线程互斥笔记
- JAVA并发编程学习笔记之AQS源码分析(共享与互斥)
- JAVA并发编程学习笔记之AQS源码分析(共享与互斥)
- JAVA并发编程学习笔记之AQS源码分析(共享与互斥)(r)
- Java并发编程之同步互斥问题
- Java并发编程之同步互斥问题
- 【Java】线程并发、互斥与同步
- Java并发编程(4)-互斥
- Java并发编程-互斥(四)
- <Java 并发编程实战>抄书笔记之线程安全性
- Java并发编程实践笔记之-什么是线程安全
- Java并发编程实践笔记之—线程
- Java 并发编程之线程安全(随手笔记)
- java编程思想笔记-并发之线程加入
- java编程思想笔记-并发之线程协作(一)
- java编程思想笔记-并发之线程协作(二)
- java编程思想笔记-并发之线程协作(三)
- java编程思想笔记-并发之线程协作(四)
- Automatic Editing(字符串替换)
- 第十五周项目二-阅读程序2
- hdu~2795(线段树)
- iOS自定义控件之图像选取按钮
- 学习笔记_CCNx_20141204(1)
- Java并发编程之线程互斥笔记
- POJ 3729 Facer’s string
- mfcc
- C99
- Hadoop快速入门
- 2014年工作中遇到的20个问题:141-160
- 关于Android ADT和SDK更新的问题
- 【BZOJ】【P1030】【JSOI2007】【文本生成器】【题解】【AC自动机】
- Linux启动gdb调试模式二——断点调试