轻松学会多线程(四)——synchronized同步关键字知多少

每一个对象都有一把独占锁。独占锁只限制线程对它的同步方法的访问,对非同步方法,独占锁没有意义。

synchronized关键字可以作为函数的修饰符,也可以作为函数内的语句,也就是平时说的同步方法和同步代码块。如果再细分的话,synchronized可以作用域instance变量、对象引用、static函数和类上。

不过无论synchronized关键字加载方法上还是对象上,它取得的锁都是对象锁。而不是把一段代码或者函数当做锁。所以说,尽管我们对方法进行了同步,该同步方法还是有可能被其他线程的对象访问的。

作用域

1、在某个对象实例内

比如代码块儿、方法上的同步,可以防止多个线程同时访问这个对象(注意:是这一个对象。该类的其他对象的同步方法对应另外一个对象锁)的同步方法。这时,不同对象实例的同步方法,是不互相干扰的。也就是说,其他线程依然可以访问相同类的另一个对象的同步方法。

如果一个对象里可以有任意多个同步方法。任意时间里只能有一个线程访问这个对象的这些同步方法。

例如,现成T1在访问同步方法Method1,此时还有一个同步方法Method2此时无人访问,但是由于已经有一个线程正在访问这个对象的同步方法Method1,所以试图访问Method2的线程将被阻塞。直到T1对M1的访问结束。

可见同步方法有在一个同步方法运行期内保证只有一个线程能够进入。一旦方法结束,里面的线程就会失去对该对象的独占权。 synchronized语句块,可以指定要获得哪个对象的独占权,一旦获得,在语块执行过程中,线程会始终掌握该对象的独占权。此时,它可以连续访问多个该对象的同步方法。在整个过程中,独占权都牢牢掌握在该线程手中,其它线程没有任何机会。而如果没有同步语句块,则如果连续访问某个对象的同步方法,则在前一个方法返回,到下一个方法调用的间隙内,其他线程有机会抢先获得该对象的独占权。

PS:synchronized关键可以修饰函数、函数内语句。无论它加上方法还是对象上,它取得的锁都是对象,而不是把一段代码或是函数当作锁。

2、某个类的范围

比如在静态方法上加上同步关键字,由于静态方法是类级别的,所以它可以多累的所有对象实例都起作用。

synchronized方法控制对类成员变量的访问:每个类实例一把锁,每个同步方法都必须获得调用该方法的类实例的锁,才能执行,否则该线程会进入阻塞状态,一旦执行,就独占该锁,知道其释放锁为止。

这种机制确保了同一时刻对应一个类实例,有效避免类成员变量访问冲突的问题。属于以牺牲效率确保安全的策略。

PS:Java中,不仅类的每个对象都队赢一把独占锁,每一个类也对应了一把锁。我们可以将类的静态成员声明为synchronized,来控制器类的静态成员变量的访问。

总结一下:

通过上面的论述,我们可以得出:synchronized关键字的同步方法,本质上是 作用于对象的引用。哪一个线程拿了对象锁A,就能够调用该对象的同步方法;而对象锁B,与A锁毫不相干,程序可以通过对象锁B任意访问同步方法。

3、同步代码块

同步代码块也值得一提。代码块中的同步,表示对这个区块的资源实行呼哧访问,它的作用域也是当前对象。这时锁就是对象,谁拿到了这个锁,就可以运行它锁控制的那段代码。

PS:synchronized关键字是不能继承的,集成类需要你显示指定它的某个方法为同步方法。

时间: 2024-11-09 09:45:59

轻松学会多线程(四)——synchronized同步关键字知多少的相关文章

轻松学会多线程(一)——多线程介绍

在大数据,高并发的需求中,如何让自己所在的企业,在物竞天择的恶劣环境下,生存并且更好的生存下来呢?这就避免不了编写并发程序.而且在软件设计之初,我们就要考虑,哪些串行程序使用并行方式运行会更加高效.这就要涉及到多任务间的协作和数据共享等问题. 如今多核时代的不断发展,早已告别了单核处理器的年代.看看周围同事的电脑,至少都是四核的处理器,更别说工作站.服务器了.而我们所编写的串行程序,每一次运行,都只是在一个处理器上运行的.也就是说,我们只使用了不到四分之一的CPU系统资源,这无疑是一种极大的资源

轻松学会多线程(二)——多线程相关概念介绍

上一篇文章中,我们宏观介绍了多线程的背景,今天我们上一些干货. 在展开讲解多线程之前,我们需要明白进程与线程之间的关系. 进程与线程 一个关于进程和线程的比喻很贴切:一个进程就像是工厂的一个车间,代表CPU所能处理的单个任务,任一时刻,CPU总是运行一个进程,其他进程处于非运行状态.而车间的工人,就好比线程,一个进程可以包含多个线程. (线程,就好比工厂里的工人,车间的空间是工人们共享的,多个房间是每个工人都可以进出的) 操作系统中,所有运行的任务都对应一个进程.当一个程序进入内存运行,即变成一

synchronized同步关键字

参考:http://blog.csdn.net/luoweifu/article/details/46613015 synchronized是Java中的关键字,是一种同步锁.它修饰的对象有以下几种: 1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象: 2. 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象: 3. 修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这

轻松学会多线程(三)——如何确定线程数

一般情况下,在互联网编程中,我们会使用多线程来抢夺网络资源.那么,线程数量我们如何来确定呢? 我们都知道,线程数量和CPU核数有关.所以有人建议说:线程数为核数的两倍最好. 其实只要这些线程不频繁切换.竞争资源的话.想要最优性能,还是根据具体项目慢慢调试. CPU切不切换我们没法控制,只能提高线程优先级以获取更多的CPU时间. CPU除了处理Java还需要处理N多系统和其他线程,一般而言,多线程编程中,在确保内存不溢出的情况下提升线程数是可以提高CPU中签率的,也就是能提高你的程序处理数据的速度

Synchronized 同步关键字

当synchronized关键字修饰一个方法的时候,该方法叫做同步方法. Java中的每个对象都有一个锁(lock),或者叫做监视器(monitor),当一个线程访问某个对象的synchronized方法时,将该对象上锁,其他任何线程都无法再去访问该对象的synchronized方法了.直到之前的那个线程执行方法完毕后(或者是抛出了异常),才将该对象的锁释放掉,其他线程才有可能再去访问该对象的synchronized方法.

同步关键字synchronized

同步关键字synchronized 同步关键字synchronized使用简洁,代码可维护性好.在JDK6中,性能也比早期的JDK有很大的改进.如果可以满足程序要求,应该首先考虑这种同步方式. 关键字synchronized一个最为常用的用法是锁定一个对象的方法: public synchronized void method() {} 此时,当method()方法被调用时,调用线程必须首先获得当前对象的锁,若当前对象锁被其他线程持有,则调用线程会等待,方法结束后,对象锁会被释放.以上方法等价于

5.同步关键字(synchronized)

同步关键字(synchronized): 多线程给我们提供方便的时候,也给整个编程增加了难度,尤其是对临界资源的控制,尤为重要. 一个在操作系统课上,老掉牙的事例,就把这种情况解释的明明白白. 一对夫妻共用一张银行卡,老公呢准备出去买盒烟,一查卡里还有10000元, 但在他买烟的同时,他媳妇一下子支出去9999元,现实当中肯定是买不成烟了, 但多线程中,如果不加以控制,就会造成脏读脏写. 实例: package com.xm.thread.t_19_01_27; import java.util

四、java多线程核心技术——synchronized同步方法与synchronized同步快

一.synchronized同步方法 论:"线程安全"与"非线程安全"是多线程的经典问题.synchronized()方法就是解决非线程安全的. 1.方法内的变量为线程安全 public void addI(String username) { try { int num = 0; \\方法内的变量为线程安全 if (username.equals("a")) { num = 100; System.out.println("a set

Java多线程synchronized同步

非线程安全问题 “非线程安全”问题存在于“实例变量”中,如果是方法内部的私有变量,则不存在“非线程问题”.也即是说,方法中的变量永远是线程安全的. 如果多个线程共同访问1个对象中的实例变量,则可能线程不安全.下面以实例说明 1 public class HasSelfNum { 2 private int num = 0; 3 public void add(String name) { 4 try { 5 if (name.equals("a")) { 6 num = 100; 7