线程同步(synchronized关键字)

概念

解决数据共享问题,必须使用同步,所谓同步就是指多个线程在同一时间段内只能有一个线程执行代码,其他线程要等待此线程完成之后才可以继续执行。

方法

线程进行同步,有以下两种方法:
(1)同步代码块
synchronized(要同步的对象){
要同步的操作;
}
(2)同步方法
public synchronized void method(){
要同步的操作;
}
同步代码块示例

package 线程同步与死锁;
public class Example {

        public static void main(String[] args) {
        MyThread my=new MyThread();
        Thread t1=new Thread(my,"小白");
        Thread t2=new Thread(my,"小红");
        t1.start();
        t2.start();
    }
}
class MyThread implements Runnable{
    Object obj=new Object();//同步的标记对象,可以设置为任意对象
    public void run() {
        /*
         * 同步代码块
         * 当某一线程运行至同步代码块时,obj的赋值将会改变
         * 比如没有线程进入同步代码块时,obj==0,表示代码块为开放状态
         * 当有线程运行至同步代码块时,obj==1,
         * 表示代码块为上锁状态,不允许其他线程进入
         * 
         */

        synchronized (obj) {
            System.out.println(Thread.currentThread().getName()+"正在出恭……");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"出恭完毕……");
        }

    }

同步代码块输出
同步方法示例:

package 线程同步与死锁;
public class Example {

        public static void main(String[] args) {
        MyThread my=new MyThread();
        Thread t1=new Thread(my,"小白");
        Thread t2=new Thread(my,"小红");
        t1.start();
        t2.start();
    }
}
class MyThread implements Runnable{
    Object obj=new Object();//同步的标记对象,可以设置为任意对象
    public void run() {
        doMethod();
    }
    /*
     * 同步方法,标记对象当前对象(this)
     * 当同时又若干个同步方法时,this却只有一个
     * this被使用时会上锁(也就是进行赋值标记),
     * 确保同步方法不会同时执行多个
     * 
     */
    public synchronized void doMethod(){
         System.out.println(Thread.currentThread().getName()+"正在出恭……");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"出恭完毕……");
    }
}

同步方法输出

注意

当编写synchronized块时,有几个简单的准则可以遵循,这些准则在避免死锁性能危险的风险方面大有帮助
(1)使代码块保持简短,把不需要同步的代码移出代码块
(2)不要阻塞。如在代码块中使用InputStream.read()。
(3) 在代码块中,尽量不要再调用其他类中声明的方法,防止死锁

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值