java线程基础

来源:互联网 发布:mysql 5.17 ngram 编辑:程序博客网 时间:2024/05/22 02:13

1、异常类可以通过继承Runnable接口,或者继承Thread类

2、线程安全:当多个线程访问访问同一个代码块时总是能表现出正确的行为

      synchronized:被synchronized修饰的代码块(给代码块加锁),一次只有一个线程拿到执行该代码块的锁。而其他线程要执行该代码块必须等待持锁的线程释放该锁。

      注:线程之间存在锁竞争的问题。在释放锁的时候,其他线程就会去竞争锁,这可能导致cpu占用变高


3、多个线程可以有多个锁:多个线程,每个线程有自己的锁,拿到自己的锁后去执行synchronized方法

public class MoreLock {
private int num = 0;
public synchronized (static) void initNum(String str){
if(str.equals("a")){
num = 100;
System.out.println("this num is inited by 100");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
num = 200;
System.out.println("this num is inited by 200");
}
System.out.println("this num is " + num);
}
public static void main(String[] args) {
final MoreLock moreLock1 = new MoreLock();
final MoreLock moreLock2 = new MoreLock();
Thread t1 = new Thread(new Runnable() {

@Override
public void run() {
moreLock1.initNum("a");
}
});
Thread t2 = new Thread(new Runnable() {

@Override
public void run() {
moreLock2.initNum("b");;
}
});
t1.start();
t2.start();
}
}

以上:t1持有moreLock1的锁,t2持有moreLock2 的锁。两个线程持有的锁不同

  注:一个对象持有一把锁,要想该类的所有对象持有相同的锁,在方法上加static关键字即可,如上。

未加static的输出结果:

this num is inited by 100                                                         this num is inited by 100
this num is inited by 200      本来所有对象持有一把锁的输出结果应该是(也是加static的结果):    this num is 100   
this num is 100              this num is inited by 200
this num is 200              this num is 100 


     

0 0
原创粉丝点击