java多线程(二)

死锁

两个或多个线程之间使用了互斥锁,然后一方锁上了之后就睡眠等待其他线程,这时同步代码块还没执行完,就到其他线程了,其他线程也锁上了再睡眠,等待一开始的线程,但是一开始的线程在等待最后的线程执行完释放资源,但是一开始的线程不执行完,那么最后的线程也不会执行完,就僵持了,这样就出现了死锁。

线程同步

两种方式:同步方法和同步代码块

同步方法

在方法上加synchronized变为同步方法,是给当前类对象加锁

非静态方法,锁在this

静态方法。,所在类.class

锁的释放

在同步方法执行完才释放锁

同步方法的锁的范围太大了,整个方法都被锁住了,其中如果有不需要同步执行的代码的话就太浪费资源了,效率很低,所以可以使用同步代码块。

public synchronized  void pick(){
  if (num>0){
      System.out.println(Thread.currentThread().getName()+"取走了50W");
      num-=50;
  }
}

同步代码块

synchronized(锁对象) { //括号里可以是对象,类。class

}

private int state;
private static Wan w = new Wan();
private static Kuaizi k = new Kuaizi();
public void Eat(){
   if (state==0){
       synchronized (k){
           System.out.println(Thread.currentThread().getName()+"找到了筷子");
           try {
               TimeUnit.SECONDS.sleep(1);
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
       }
       synchronized (w){
           System.out.println(Thread.currentThread().getName()+"找到了碗");
       }
   }
   if (state==1){
       synchronized (w){
           System.out.println(Thread.currentThread().getName()+"找到了碗");
           try {
               TimeUnit.SECONDS.sleep(1);
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
       }
       synchronized (k){
           System.out.println(Thread.currentThread().getName()+"找到了筷子");
       }
   }
}

同步的缺点

效率低

会造成死锁

public class Test {
    public static void main(String[] args) {
​
        Test test = new Test();
​
        new Thread(new Runnable() {
            @Override
            public void run() {
                test.one();
            }
        },"A").start();
​
        new Thread(new Runnable() {
            @Override
            public void run() {
                test.two();
            }
        },"B").start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                test.three();
            }
        },"C").start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                four();
            }
        },"D").start();
    }
​
    //非静态同步方法
    public synchronized void one(){
        System.out.println("one..");
        try {
            Thread.sleep(1000);//只会释放cpu资源,但是不会释放锁,同步如果没有释放锁,那么抢占到资源也不糊运行
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    //非静态同步方法
    public synchronized void two(){
        System.out.println("two..");
​
    }
    //普通方法
    public void three(){
        System.out.println("three....");
    }
    //静态同步方法
    public synchronized static void four(){
        System.out.println("four....");
    }
​
​
}

 

笔记

Runnable实现的线程,必须是同一个runnable的对象new出来的线程才共享资源。

Test03 test03 = new Test03();
new Thread(test03,"张三").start();
new Thread(test03,"张三老婆").start();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值