并发编程学习笔记

时间:2022-04-24 18:02:28

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异常,那么程序直接就停止了