并发编程学习笔记

1.线程安全:当多个线程访问某一个类(对象或方法)时,这个类始终能表现出正确的行为,那么这个类(对象或方法)就是线程安全的

2.对象锁和类锁

具体实例,看看什么是对象锁,什么是类锁:

对象锁:

 

 

package com.zhangshitong.thread01;

public class MyThread extends Thread{

    private int count=5;
    
    //synchronized 加锁
    
    public synchronized void run(){
        count--;
        System.out.println(this.currentThread().getName() + "count ="+ count);
    }
    
    public static void main(String[] args) {
        /**
         * 分析:当多个线程访问myThread的run方法时,以排队的方式进行处理(这里排队是按cpu分配的先后顺序而定的)
         * 
         */
        MyThread myThread =new MyThread();
        Thread t1=new Thread(myThread,"t1");
        Thread t2=new Thread(myThread,"t2");
        Thread t3=new Thread(myThread,"t3");
        Thread t4=new Thread(myThread,"t4");
        Thread t5=new Thread(myThread,"t5");
        
        t1.start();
        t2.start();
        t3.start();
        t4.start();
        t5.start();
    }
}

 以上就是对象锁,下面看一下类锁:

package com.zhangshitong.thread01;

public class MultiThread {
    
    private  int num=0;
    
    /**
     * static
     */
    public  synchronized void printNum(String tag){
        try {
            if(tag.equals("a")){
                num=100;
                System.out.println("tag a, set num over!");
                Thread.sleep(1000);
            }else{
                num=200;
                System.out.println("tag b, set num over!");
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) {
        //两个不同对象
        final MultiThread m1=new MultiThread();
        final MultiThread m2=new MultiThread();
        
        Thread t1=new Thread(new Runnable() {
            
            @Override
            public void run() {
                m1.printNum("a");
            }
        });
        
        Thread t2=new Thread(new Runnable() {
            
            @Override
            public void run() {
                m1.printNum("b");
            }
        });
    }

}

这个可以看出,是两个对象,那么锁也就是两个锁了,所以t1和t2之间不存在竞争,那如果想让t1和t2之间出现京城,该怎么做呢?

就是把属性num前加static  在printNum方法前加static   解释如下:在静态方法上加上synchronized,那么线程所获得的锁就是这个类级别的锁了

 2.

举例如下:

package com.bjsxt.base.sync005;
/**
 * synchronized的重入
 * @author alienware
 *
 */
public class SyncDubbo1 {

    public synchronized void method1(){
        System.out.println("method1..");
        method2();
    }
    public synchronized void method2(){
        System.out.println("method2..");
        method3();
    }
    public synchronized void method3(){
        System.out.println("method3..");
    }
    
    public static void main(String[] args) {
        final SyncDubbo1 sd = new SyncDubbo1();
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                sd.method1();
            }
        });
        t1.start();
    }
}

3.存储过程,游标 for 加 begin  end 中有 exception 记录出错的操作,并写入日志:

4.异常:interruptedexception   continue 跑出本次异常,并截止往下执行,如果是RuntimeException异常,那么程序直接就停止了

原文地址:https://www.cnblogs.com/zhangshitong/p/7406676.html