鱼C论坛

 找回密码
 立即注册
查看: 2398|回复: 0

[学习笔记] java 笔记 线程5

[复制链接]
发表于 2017-8-22 21:00:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
线程安全问题就是是 多个线程访问同一个 共享资源 ,如果多个线程不同步数据的话,会出现问题,可以用 synchronized(对象)同步数据维护数据。synchronized机制是给共享资源上锁,在执行之前要拿到同步对象的锁(一个对象一把锁)才可以执行同步的内容,在执行过程中不会被其他线程参与进来,同步代码在同一刻只执行一个线程,而且也同步了共享资源,只有拿到锁的线程才可以访问共享资源,这样就可以强制使得对共享资源的访问都是顺序的,线程执行完就把锁还给对象了,也就是执行同步代码前拿到锁,执行时锁锁住了,其他线程参与不进来,执行完就还给对象锁。

同步代码格式:
synchronized(对象) { 需要同步的代码; }
同步函数格式:
修饰符  synchronized void  函数名{
}
同步的前提: 
同步需要两个或者两个以上的线程。 
多个线程共享同一个数据的时候使用的是同一个锁(有多个线程 共享数据的时候要共享同一个对象 ,如果都是同步代码synchronized(对象),填的对象一样,如果有同步代码和同步函数  同步函数同步的是什么对象 同步代码synchronized(对象)就写哪个对象)
举例子:

在同步函数中。函数都会被一个对象调用,那那个对象就是this,同步韩苏护的锁就是this,在一个类里有同步代码同步函数,既然函数的对象是this,锁是this ,同步代码就写this
在静态函数中,锁是class对象,静态内存是,内存中没有本类对象,但是一定有改类对应的字节码文件对象  也就是写 本类名。Class
单例设计模式-饿汉式和懒汉式
饿汉式:
Class Single
{
private static final  single s=new single();
private Single(){}
public static Single getInstance(){
return s;
}
}


懒汉式:
        public static void main(String[] args) {
                System.out.println("Hello World");
                }
}
                class  Single
                {                private   static Single s=null;
                private Single(){}
                public static  Single getInstance(){
                                if(s==null)
                       s=new Single();
                return s;
                }

                }
                



懒汉式和饿汉式有什么不同:
懒汉式是用于延迟加载
但在多线程中懒汉式会有安全性 解决方法就是同步  同步的话可以解决这个问题
但是会稍微有点低效 因为其他线程进来后先同步 ,可以用双重判断 加同步的时候锁是该类所属的字节码对象

解决后:
        public static void main(String[] args) {
                System.out.println("Hello World");
                }
}
                class  Single
                {
                private   static Single s=null;
                private Single(){}
                public static  Single getInstance(){
                        if (s==null)
                        {
                                synchronized(Single.class)
                                {
                                        if(s==null)
                                                s=new Single();
                                }
                                }
                        return s;
                        }

死锁:
package UI;
 
import java.lang.Thread;
 
public class sport {
   public static void main(String[] args) {
      
          Ticket  a=new Ticket();
          Ticket  b=new Ticket();
         Thread b1 =new Thread(a);
         Thread b2 =new Thread(a);
         b1.start();
         try {   Thread.sleep(10);} catch (Exception e){};
         a.flag=false;
         b2.start();
         }
 
   }
class Ticket implements Runnable
{
   private int ticket=100;
   boolean flag =true;
   Object obj =new Object();
   public void run(){
      if(flag){
      while(true){
           synchronized(obj){//把这里obj 改成this
              show();//调用的show的是this的锁
      }
      }
      }
      else
         while(true)
            show();
   }
   public synchronized void show(){//this
           synchronized(obj){//这里也改为this
           if(ticket>0){
              try {   Thread.sleep(10);} catch (Exception e){};
            System.out.println(Thread.currentThread().getName()+"…sale:"+ticket--);
           }
    }
   }
}
 

结果是 程序会挂着  执行不完
死锁:
同步中嵌套同步 同步不同
上面例子有两重锁 ,锁都是不同对象的,那就同步不了数据 ,那就是死锁了



评分

参与人数 1鱼币 +2 收起 理由
小甲鱼 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-20 22:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表