对java多线程的理解,欢迎指责

实现Runnable的好处:
1.避免单继承的局限性
2.将线程的任务从线程的子类中分离出来,进行了单独的封装,按照面向对象的思想封装成对象
Runnable r  = new Student();
Thread thread = new Thread(r);
thread.start();


synchronized表示当前线程,独占 对象 someObject
当前线程独占 了对象someObject,如果有其他线程试图占有对象someObject,就会等待,直到当前线程释放对someObject的占用。
someObject 又叫同步对象,所有的对象,都可以作为同步对象
为了达到同步的效果,必须使用同一个同步对象
synchronized即为同步关键字
加锁后放入同步代码块 当一个线程进来时加上锁,执行完同步代码块后解锁,等待下一个线程进来
synchronized(对象锁){
需要被同步的代码


}
同步的好处:解决多线程的安全问题
同步的弊端:相对降低了效率,因为同步外的线程都会判断同步锁
同步的前提:必须有多个线程并用同一个锁


同步函数的锁用的是this
同步代码块的锁用任意对象,建议使用同步代码块


单例模式面临的多线程问题:
饿汉式:
class Bank{
    private static Bank Bank = null;
    private Bank(){}
    public static synchronized Bank getintance(){
          if(bank==null){
              bank = new Bank();
          }
          return bank;
    }
//如果饿汉式用同步函数,当线程0进入时需进行判断,此时已被加上锁而阻止线程1进入
//降低了执行效率
}      
class Bank{
    private static Bank Bank = null;
    private Bank(){}
    public static synchronized Bank getintance(){
          if(bank==null){
              bank = new Bank();
          }
          return bank;
    }
//如果饿汉式用同步函数,当线程0进入时需进行判断,此时已被加上锁而阻止线程1进入
//降低了执行效率
}      
class Bank{
    private static Bank Bank = null;
    private Bank(){}
    public static Bank getintance(){
          if(bank==null){
              synchronized(Bank.class){
                if(bank==null){
                    bank = new Bank();
                }
                }
          }
          return bank;
    }
//如果饿汉式用同步代码块,用this作为锁,每个线程首先判断bank是否为空,如果为空则进入锁内执行代码块,此时不影响
//其他线程进行判断,当判断不为空时直接返回已实例化的bank,因此提高效率又带来安全
}      

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章