线程的同步
1 多个线程并发读写同一个临界资源时候会发生线程安全问题
2 可以使用 同步代码块解决 同步读写临界资源, 解决并发安全
问题.
3 a 同步代码块
synchronized(同步监视器){
}
b 同步监视器 是一个任意对象实例. 是一个多个线程之间的互
斥的锁机制. 多个线程要使用同一个"监视器" 实现同步互斥
c 常见写法:
synchronized(this){
}
d 如果方法的全部过程需要同步, 可以简单使用 synchronized
修饰方法.
Java中同步的API
1 StringBuffer 是同步的
synchronized append();
StringBuilder 不是同步的
append();
2 Vector 和 Hashtable 是同步的
ArrayList 和 HashMap 不是同步的
3 Collections.synchronizedList()
ArrayList list = new ArrayList();
List syncList = Collections.synchronizedList(list);- 为了解决死锁的,需用同步
- public class SyncDemo {
- Object monitor = new Object();
- int i=1;
- //public synchronized int getNumber(){
- public int getNumber(){
- synchronized (monitor) {// 可以使用this
- if(i==20){
- throw new RuntimeException("Over");
- }
- try {
- Thread.sleep(10);
- } catch (InterruptedException e) {
- }
- return i++;
- }
- }
- class MyThread extends Thread{
- public void run() {
- while(true){
- System.out.println(getNumber());
- }
- }
- }
-
- public void go(){
- Thread t1 = new MyThread();
- Thread t2 = new MyThread();
- t1.start();
- t2.start();
- }
-
- public static void main(String[] args) {
- new SyncDemo().go();
- }
-
-
- }
复制代码 |