原文:http://blog.csdn.net/luoweifu/article/details/46613015
作者:luoweifu
转载请标名出处
传统创建多线程方式
-
重写Thread父类的run方法
2.创建Runnable对象,将Runnable对象传递到Thread的构造方法中
Timer
TimerTask:任务
delay:延迟多少毫秒执行
period:间隔周期
线程互斥与同步
obj可以用this,也可以使用多个线程共同访问的对象
1.synchronized修饰代码块
当两个并发线程(thread1和thread2)访问同一个对象(syncThread)中的synchronized代码块时,在同一时刻只能有一个线程得到执行,另一个线程受阻塞,必须等待当前线程执行完这个代码块以后才能执行该代码块。thread1和thread2是互斥的,因为在执行synchronized代码块时会锁定当前的对象,只有执行完该代码块才能释放该对象锁,下一个线程才能执行并锁定该对象。
一个线程访问一个对象的synchronized代码块时,别的线程可以访问该对象的非synchronized代码块而不受阻塞
2.synchronized修饰方法
Synchronized修饰一个方法很简单,就是在方法的前面加synchronized,public synchronized void method(){//todo}; synchronized修饰方法和修饰一个代码块类似,只是作用范围不一样,修饰代码块是大括号括起来的范围,而修饰方法范围是整个函数。
在用synchronized修饰方法时要注意以下几点:
- synchronized关键字不能继承。
- 在定义接口方法时不能使用synchronized关键字。
- 构造方法不能使用synchronized关键字,但可以使用synchronized代码块来进行同步。
-
synchronized修饰静态方法\类
synchronized作用于一个类T时,是给这个类T加锁,T的所有对象用的是同一把锁。
总结:
A. 无论synchronized关键字加在方法上还是对象上,如果它作用的对象是非静态的,则它取得的锁是对象;如果synchronized作用的对象是一个静态方法或一个类,则它取得的锁是对类,该类所有的对象同一把锁。
B. 每个对象只有一个锁(lock)与之相关联,谁拿到这个锁谁就可以运行它所控制的那段代码。
C. 实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。