java学习笔记之线程3

来源:互联网 发布:淘宝客单页网站源码 编辑:程序博客网 时间:2024/06/04 18:48

接着线程2开始写:在线程2里面我有一些对线程理解上的偏差:线程2中的代码我只是想举这么一个例子帮助大家理解,其实那段代码根本不用设计成多线程,直接顺序执行就可以了

最重要的一点就是同一类线程会共享代码和内存空间(我在线程2中的例子是两类线程,它们拥有各自的资源,大家看到了,它们不是同步执行的,这一点也符合线程并发的特点,那个例子我用写博客,睡觉作比喻其实不太得体)
这里我们回到最根本的问题,java为什么要设计多线程呢?
我觉得最重要的一点是提高代码执行的效率和速度还有就是让系统做实时响应。那么问题来了,要想并发的去执行,同一类线程是共享代码和内存空间的,那么必然同一类线程在访问相同的资源时候会发生错误,就像我异步的去写博客和睡觉,我做这两件事都要去用到我的脑子,在线程1里我说:我异步的去做这两件事情,太费脑子了,我是同步去做这两件事的,我们先重新看看线程2中的例子:
在线程2中我睡觉和我写博客是两个类,它们拥有各自的资源,相当于我拥有两个脑子,但是我还是想先写完博客再睡觉,我写完博客才能睡觉(必须)所以想线程2那篇博客那么做肯定存在问题了


翻看API,一种简单的方法:使用join方法:
这个方法会让其他线程处于阻塞状态,意思就是等待当前线程Dead,其他线程才重新恢复到Runnable状态
这里写图片描述

代码如下:
这里写图片描述

再看执行效果:
这里写图片描述

不管执行多少次都是这个效果,说明我们的目标达到了,但是我不想每次相同步的时候都调用这个方法,能不能换一种方式呢???
线程2中就说过Synchronized这个关键字了,到现在也没用呢,现在我们就来看看它是怎么用的
1,synchronized Method(){}
这个方法叫同步方法
这里写图片描述
我们看看运行结果:
这里写图片描述
然而结果还是乱序的,这是为什么呢?
我们分析:
我写了写博客,睡觉两个类,它们继承了Runnable,分别重写了run方法,而且这两个方法都被synchronized所修饰。然后在主方法中创建了这两个类的两个线程,这两个线程各自拥有自己的资源,java想的是它们根本就不需要同步吧,如我标题所说。


我们看看创建同一个类的两个线程(run方法先不用synchronized):
这里写图片描述
运行结果:
这里写图片描述
这个writeBlog和writeBlog2都在去执行run这个方法,它们共享这个方法,所以看到执行效果是上面的样子,就是writeBlog还没执行完writeBlog2就执行了
我们用synchronized修饰run方法
直接看运行结果吧:
这里写图片描述
达到目的-就是让同一类的线程同步执行该类的方法—–把该方法用synchronized修饰。
我把原来的类做了一些改动:
这里写图片描述

但是执行结果是这样的这又是为什么呢??我把run方法用synchronized修饰了啊:
这里写图片描述
先写到这,下次再接着写
2,synchronized static Method(){}
这种用法防止对个线程对Method的访问,它对同一类的所有对象都作用
3,synchronized(this) {//代码块}
this指当前对象,{}里面的代码块叫同步块
4,synchronized class{}
能作用到这个类的所有对象

这是线程4的链接:

这是线程4的链接:

原创粉丝点击