专栏首页Golang开发Java基础——Synchronized

Java基础——Synchronized

作用

能够保证在同一个时刻最多只有一个线程执行该代码,以达到保证并发安全的效果。

资源竞争

造成数据不安全

public class SumThread implements Runnable {
    private static int count = 0;
    public void run() {
        for(int i =0;i<10000;i++){
            count++;
        }
    }
       public static void main(String[] args)  {
        SumThread thread = new SumThread();
        Thread t1 = new Thread(thread);
        Thread t2= new Thread(thread);
        t1.start();
        t2.start();
        System.out.println(count);
    }
}

对象锁

方法锁 synchronized修饰普通方法,不可以是静态方法,锁对象默认是this

public class SynchronizedThread implements Runnable {
    public void run() {
        executeThread();
    }
    private synchronized void executeThread(){
        System.out.println(Thread.currentThread().getName()+" start");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+" finish");
    }
}

同步代码锁块 需要指定锁对象

public class SynchronizedThread implements Runnable {
    public void run() {
        synchronized (this){
            System.out.println(Thread.currentThread().getName()+" start");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+" finish");
        }
    }
    public static void main(String[] args)  {
        SynchronizedThread thread = new SynchronizedThread();
        Thread t1 = new Thread(thread);
        Thread t2= new Thread(thread);
        t1.start();
        t2.start();
    }
}

类锁

Java类可能有很多个对象,但是只有1个Class对象,类锁只能在同一个时刻被一个对象所拥有。

public class SynchronizedThread implements Runnable {
    public void run() {
        synchronized (SynchronizedThread.class){
            System.out.println(Thread.currentThread().getName()+" start");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+" finish");
        }
    }
}

可重入

指的是同一个线程的外层函数获得锁之后,内层函数可以直接再次获得该锁。 可重入原理:加锁次数计数器。 JVM负责跟踪对象被加锁的次数 线程第一次给对象加锁的时候,计数变为1。每当这个相同的线程再次对象上再次获得锁时,计数会递增。 每当任务离开时,计数递减,当计数为0的时候,锁被完全释放。

不可中断

一旦这个锁已经被其他线程占用,只能等待其他线程释放这个锁。否在只能一直等待下去。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java基础——流程控制

    while循环的特点是先判断布尔表达式是否为真,如果为真,继续执行循环体,否则跳过循环

    羊羽shine
  • golang-101-hacks(1)——创建开发环境

    注:本文是对golang-101-hacks中文翻译,本文的原文地址 创建Go开发环境是非常容易的,以Linux系统为例,你只需要从https://golan...

    羊羽shine
  • Recursion递归

    编程的角度来看,程序调用自身的编程技巧称为递归(recursion)。 本质上将原来的问题转化成更小的同一问题。就是一个函数直接或间接调用自身的一种方法,它通...

    羊羽shine
  • 浅谈parallelStream 顶

    parallelStream是什么,它是一个集合的并发处理流.其作用是把一个集合中的数据分片,进行一个多线程的处理,增快运行速度.

    算法之名
  • 004.多线程-线程的三种创建方式

    当前主流的就是面向接口开发, 因为实现了接口后还可以根据业务需要再继承其他的类。 实现Runnable接库与实现Callable接口对比来看, Calla...

    qubianzhong
  • java如何关闭钩子(ShutdownHook)

    Java程序中可以通过添加关闭钩子,实现在程序退出时关闭资源、平滑退出的功能。 同理关闭钩子是removeShutdownHook 使用Runtime.ad...

    陈灬大灬海
  • python之syslog模块

    syslog模块为提供了rsyslog模块的一个接口。可以记录程序运行时的输出信息。

    py3study
  • Java8新特性之日期-时间API

    在Java8之前的版本中,我们处理时间类型常常使用的是java.util包下的Date类。

    Java团长
  • 高并发编程系列

    放在静态方法上面,由于静态没有this可以锁定,不需要new 出对象,运用了反射.

    全栈自学社区
  • 洛谷P4438 [HNOI/AHOI2018]道路(dp)

    \(f[i][a][b]\)表示从根到\(i\)的路径上,有\(a\)条公路未被翻修,\(b\)条铁路未被翻修

    attack

扫码关注云+社区

领取腾讯云代金券