Java线程

来源:互联网 发布:摩尔庄园 mac 破解 编辑:程序博客网 时间:2024/06/06 04:37

进程是一个正在执行的程序,是操作系统管理的。
执行过程,持有资源和线程。
多线程是一个进程中多个线程,轻量级的进程,线城是进程的组成。
线程是系统中最小的单元,一个进程=>多个线程,共享内存和资源。
有两种方法,
第一种,继承thread类,第二种实现runnable接口。
Thread:继承thread定义一个线程类,只要继承Thread类,他就是一个线程类。
第二种,实现Runnable接口。
重写run方法,run中就是代码要执行的代码。

几种解决线程同步的方法:

public class Bank {    /**     * @param args     */    private int count = 0;    //存钱    public void addMoney(int money){        count += money;        System.out.println(System.currentTimeMillis()+"存进"+money);    }    //取钱    public void subMoney(int money){        if(count - money <0){            System.out.println("余额不足");            return;        }        count -= money;        System.out.println(+System.currentTimeMillis()+"取出"+money);    }    //查询    public void lookmoney(){        System.out.println("账户余额" + count);    }    public static void main(String[] args) {        // TODO Auto-generated method stub    }}

第一种方法加锁

public class Bank2 {    private int count = 0;    //存钱    public synchronized void addMoney(int money){        count += money;        System.out.println(System.currentTimeMillis()+"存进"+money);    }    //取钱    public synchronized void subMoney(int money){        if(count - money <0){            System.out.println("余额不足");            return;        }        count -= money;        System.out.println(+System.currentTimeMillis()+"取出"+money);    }    //查询    public  void lookmoney(){        System.out.println("账户余额" + count);    }}

第二种:关键代码处加锁

同步是一种高开销的操作,因此应该尽量减少同步的内容。通常没有必要同步整个方法,使用synchronized代码块同步关键代码即可。

public class Bank3 {    private int count = 0;    //存钱    public  void addMoney(int money){        synchronized(this){            count += money;        }        System.out.println(System.currentTimeMillis()+"存进"+money);    }    //取钱    public synchronized void subMoney(int money){        if(count - money <0){            System.out.println("余额不足");            return;        }        synchronized(this){            count -= money;        }            System.out.println(+System.currentTimeMillis()+"取出"+money);    }    //查询    public  void lookmoney(){        System.out.println("账户余额" + count);    }}

第三种:使用volatitle

a.volatile关键字为域变量的访问提供了一种免锁机制

b.使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新

c.因此每次使用该域就要重新计算,而不是使用寄存器中的值

d.volatile不会提供任何原子操作,它也不能用来修饰final类型的变量

public class Bank4 {    private volatile int count = 0;    public  void addMoney(int Money){        if(count - Money <0){            System.out.println("余额不足");            return;        }        count +=Money;         System.out.println(+System.currentTimeMillis() +"取出"+Money);    }    //取钱    public void subMoney(int money){        if(count - money <0){            System.out.println("余额不足");            return;        }        count -= money;        System.out.println(+System.currentTimeMillis()+"取出"+money);        }    //查询    public void lookmoney(){        System.out.println("账户余额:"+count);    }}

第四种:

在JavaSE5.0中新增了一个java.util.concurrent包来支持同步。ReentrantLock类是可重入、互斥、实现了Lock接口的锁, 它与使用synchronized方法和快具有相同的基本行为和语义,并且扩展了其能力。

ReenreantLock类的常用方法有:

ReentrantLock() : 创建一个ReentrantLock实例

lock() : 获得锁

unlock() : 释放锁

注:ReentrantLock()还有一个可以创建公平锁的构造方法,但由于能大幅度降低程序运行效率,不推荐使用

public class Bank5 {    private int count = 0;    //需要声明这个锁    private Lock lock = new ReentrantLock();    //存钱    public void addMoney(int money){        lock.lock();//上锁        try{        count += money;        System.out.println(System.currentTimeMillis()+"存进"+money);        }finally{            lock.unlock();//解锁        }    }    public void subMoney(int money){        lock.lock();            if(count-money <0){                lock.lock();                try{                    if(count-money<0){                        System.out.println("余额不足");                        return;                    }                }finally{                    lock.unlock();                }            }    }    // 查询      public void lookMoney() {          System.out.println("账户余额:" + count);      }  }

//线程启动

public class SynThreadTest {    public static void main(String[] args) {        final Bank4 bank = new Bank4();        //存钱线程        Thread tadd = new Thread(new Runnable() {            @Override            public void run() {                // TODO Auto-generated method stub                while(true){                    try {                        Thread.sleep(1000);                    } catch (InterruptedException e) {                        // TODO Auto-generated catch block                        e.printStackTrace();                    }                    bank.addMoney(100);                    bank.lookmoney();                    System.out.println("\n");                }            }        });        //取钱线程        Thread tsub =new Thread(new Runnable() {            @Override            public void run() {                // TODO Auto-generated method stub                while(true){                    bank.subMoney(100);                    bank.lookmoney();                    System.out.println("\n");                    try {                        Thread.sleep(100);                    } catch (InterruptedException e) {                        // TODO Auto-generated catch block                        e.printStackTrace();                    }                       }            }        });        //线程启动。        tsub.start();        tadd.start();    }}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 主板与cpu不兼容怎么办 cpu跟主板不兼容怎么办 软件与电脑不兼容怎么办 win8系统无限重启怎么办 安装微信旧版本登录提示升级怎么办 手机软件与系统不兼容怎么办 下载旧版本微信闪退登陆不了怎么办 企业微信一直登录失败怎么办 360浏览器9.1经常卡死怎么办 手机版爱奇艺看电影屏幕变小怎么办 找不到旧版本米聊怎么办 苹果id被锁了怎么办 新浪微博支付宝解绑失败怎么办 阿里妈妈升级看不到引流人数怎么办 阿里妈妈账号被冻结怎么办 微博昵称到次数怎么办 五星好评之后忘记截图了怎么办 评价后忘了截图怎么办 好评率太低不能买东西了怎么办 淘宝评价被删了怎么办 淘宝店铺有流量没有成交怎么办 淘宝好评被删了怎么办 淘宝评论被系统删除怎么办 淘宝被商家删除评价怎么办 淘宝评价管理商家删除了怎么办 淘宝商家删除评价我该怎么办 我的评价隐藏了怎么办 淘宝把评论删了怎么办 淘宝虚假交易被删除评价怎么办 淘宝好评评错了怎么办 被淘宝骗了好评怎么办 美团好评被删了怎么办 卖家收到好评内容是差评怎么办 淘宝收货电话写错了怎么办 淘宝评价写错了怎么办 饿了么商家差评怎么办 淘宝不给补差价怎么办 淘宝顾客给差评怎么办 淘宝买家账号体检违规怎么办 买家淘宝账户体检中心违规怎么办 淘宝卖家电话骚扰该怎么办