多线程

原文:http://blog.csdn.net/luoweifu/article/details/46613015
作者:luoweifu
转载请标名出处

传统创建多线程方式

  1. 重写Thread父类的run方法


    多线程_第1张图片
    方式1

2.创建Runnable对象,将Runnable对象传递到Thread的构造方法中


多线程_第2张图片
方式2.png

Timer

TimerTask:任务
delay:延迟多少毫秒执行
period:间隔周期


多线程_第3张图片
Timer定时器

线程互斥与同步

多线程_第4张图片

obj可以用this,也可以使用多个线程共同访问的对象
1.synchronized修饰代码块
当两个并发线程(thread1和thread2)访问同一个对象(syncThread)中的synchronized代码块时,在同一时刻只能有一个线程得到执行,另一个线程受阻塞,必须等待当前线程执行完这个代码块以后才能执行该代码块。thread1和thread2是互斥的,因为在执行synchronized代码块时会锁定当前的对象,只有执行完该代码块才能释放该对象锁,下一个线程才能执行并锁定该对象。
一个线程访问一个对象的synchronized代码块时,别的线程可以访问该对象的非synchronized代码块而不受阻塞

当没有明确的对象作为锁,只是想让一段代码同步时,可以创建一个特殊的对象来充当锁:
多线程_第5张图片

2.synchronized修饰方法
Synchronized修饰一个方法很简单,就是在方法的前面加synchronized,public synchronized void method(){//todo}; synchronized修饰方法和修饰一个代码块类似,只是作用范围不一样,修饰代码块是大括号括起来的范围,而修饰方法范围是整个函数。

在用synchronized修饰方法时要注意以下几点:

  1. synchronized关键字不能继承。
  2. 在定义接口方法时不能使用synchronized关键字。
  3. 构造方法不能使用synchronized关键字,但可以使用synchronized代码块来进行同步。
  1. synchronized修饰静态方法\类


    多线程_第6张图片

synchronized作用于一个类T时,是给这个类T加锁,T的所有对象用的是同一把锁。

总结:

A. 无论synchronized关键字加在方法上还是对象上,如果它作用的对象是非静态的,则它取得的锁是对象;如果synchronized作用的对象是一个静态方法或一个类,则它取得的锁是对类,该类所有的对象同一把锁。
B. 每个对象只有一个锁(lock)与之相关联,谁拿到这个锁谁就可以运行它所控制的那段代码。
C. 实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。

你可能感兴趣的:(多线程)