导航:首页 > 编程语言 > javasynchronized原理

javasynchronized原理

发布时间:2023-01-24 21:25:14

java synchronized 修饰方法和函数

Java语言的关键字,当synchronized用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。

一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。

二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。

三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。

四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。

五、以上规则对其它对象锁同样适用。

❷ java中 synchronized同步处理后 为什么只有一个线程在运行呢

  1. 这个跟CPU性能有关, 完全一致的代码在我的电脑和公司的电脑上, 发现CPU对线程调度与执行速度不一致, 实际测试过,性能好的CPU需要大量增加线程循环执行次数, 我的机器上是10000次), 才能看到其他线程的执行, 而公司的电脑只要循环10次, 就能看到别的线程执行了

  2. 当sleep在synchronized同步方法或同步块之外的时候,三个线程都有执行, 是因为sleep方法会给其他线程运行的机会,而不管其他线程的优先级, (但在synchronized同步方法里的sleep, 由于被锁住所以没有优先级之说, 也就是说synchronized同步方法里的sleep失效了, 这是我的猜想)

  3. 想看到线程具体的执行过程,可以打开JDK bin目录下的jvisualvm.exe 监视JavaJVM的状态,如图:

❸ java 问题,synchronized(),里面为什么要带参数怎么理解呢

synchronized常用的有三种,第一种,修饰static方法,表示这个静态方法是同步方法,简单地说如果现在有一个线程调用这个方法,其他人就不能再调用了。第二种,修饰普通方法,表示同一实例的该方法只能被依次调用。第三种就是你说的这个加参数,表示锁住某个对象。具体是干什么的不是很简单的说清楚的,大部分场景加对象锁是为了能安全操作这个对象,有些可能只是简单把这个对象当个锁而已,synchronized的执行体里面并不会对这个对象进行任何操作。其实你可以先理解synchronized的本身意义所在,其他的以后慢慢去体会。举个例子:假设有好多个人要修改一个文本文件,在没有锁机制的时候,很可能同时多个人在修改一个文本,肯定会乱套,这个改的被那个覆盖了之类的等等。如果采用加锁就可以避免,每个人开始修改的时候先加锁,改完再释放锁,每次只允许一个人修改。

❹ java中Synchronize是什么

您好,

用synchronize修饰表示这个类或方法为同步的,在运行过程中会上同步锁,即,如果有一个线程在访问这个方法,那么另外一个线程就不能访问它

synchronized 方法:通过在方法声明中加入 synchronized关键字来声明 synchronized 方法。如:
public synchronized void accessVal(int newVal);
synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得 该锁,重新进入可执行状态。这种机制确保了同一时刻对于每一个类实例,其所有声明为 synchronized 的成员函数中至多只有一个处于可执行状态(因为至多只有一个能够获得该类实例对应的锁),从而有效避免了类成员变量的访问冲突(只要所有可能访问类成员变 量的方法均被声明为 synchronized)。
在 Java 中,不光是类实例,每一个类也对应一把锁,这样我们也可将类的静态成员函数声明为 synchronized ,以控制其对类的静态成员变量的访问。

synchronized 方法的缺陷:若将一个大的方法声明为synchronized 将会大大影响效率,典型地,若将线程类的方法 run() 声明为 synchronized ,由于在线程的整个生命期内它一直在运行,因此将导致它对本类任何 synchronized 方法的调用都永远不会成功。当然我们可以通过将访问类成员变量的代码放到专门的方法中,将其声明为 synchronized ,并在主方法中调用来解决这一问题,但是 Java 为我们提供了更好的解决办法,那就是 synchronized 块。

参考资料:http://wenku..com/view/4c8a180d581b6bd97f19ea60.html

希望我的回答帮得到您,来自【网络懂你】团队,满意请采纳噢~O(∩_∩)O~

❺ java中的同步代码块,为什么随便放个对象,就可以锁住代码块呢什么原理

synchronized(这里的对象你看成一道门) {
这里是一个人进来了,把门反锁了

需要同步操作的代码

这里是里面的人事情做完了,出去了,门开着其他人可以进了
}

至于怎么锁的,这是java和jvm的规定和实现细节,作为普通程序员没必要深入那么多。

❻ synchronized,锁,多线程同步的原理是咋样的

你这是三个概念,我就简单的回答一下吧,让你先了解一下他们是做什么的。至于高深的一句两句也说不完。
(1)synchronized 是java中的关键字,它可以修饰方法和代码块;它的作用是保证其修饰的方法或代码块每次只能进来一个线程执行。其他线程处于等待状态,只有等占有这个同步方法或代码块的那个线程执行完,其他的线程才能进来执行。
(2)锁 Lock;它是java util包下的一个接口,它的作用与synchronized 类似,但是它有几个实现类,还有很多方法,所以Lock的功能比synchronized 强。例如Lock可以让等待的线程不等待了,去做别的工作。而synchronized 就无法办到。Lock还有很多其他强大的方法,这里不一一介绍了。
(3)多线程:多线程一般都是用线程池控制,线程池掌握好它的构造参数,也就了解了怎么用。 多线程原理就是相当于多条马路,打个比方:十一房价,很多开车的回家,一条高速路很堵,车走的很慢。如果在旁边多开几条路,车流量还是那么大;但是路多了,自然走起来就快了。
程序应用场景:小A与小B通过http通信,这个功能你要用一条线程做的话,就是小A发第一条消息发送成功后,才能发第二条。不然第二条就一直等待着,相当于堵车了。
但是如果你有两条线程的话,第二条消息就不用等待了,直接让它走第二个线程。这样就实现了多线程同步。

❼ java 问题,synchronized(),里面为什么要带参数怎么理解呢该怎么写

synchronized的参数代表的是“对象锁”。sychronized加锁的是对象,而不是代码。
我举了个例子:
public class Person
{
private String name; //意思差不多就是你那个obj
public setName(String name)
{
synchronized(name)
{
this.name = name;
}
}
}
代表的是不同的线程在synchronized块里,同时只有一个线程能执行该代码块,而类的不同实例之间是互不影响的。比如Person A = new Person(),Person B = new Person().A和B之间是不受synchronized制约的。
而:
public class Person()
{
private String name; //意思差不多就是你那个obj
public setName(String name)
{
synchronized(Person.class)
{
this.name = name;
}
}
}
“Person.class”这个锁对类级别的。不同的实例之间是同步的,也就是会所A和B必须同步访问synchronized代码块。
关于synchronized这块若要深入理解,需要对线程有个比较不多的掌握。
推荐楼主看看这个资料:http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html

❽ Java中synchronized的作用,什么情况下使用

synchronized是java中的一个关键字
我们称其为同步关键字
主要是用来处理java中的同步机制
同一个资源被用户并发访问时,会出现并发问题,比如:有一个实例变量x,第一个用户访问它,并赋值为100,但还没有来得及打印出x,另一个哥们进来访问了x,并改为200,这时候第一个哥们兴高采烈的打印出x的值,但却发现不是100,是200.这哥们就郁闷了,怎么回事呢?
这就是并发问题,但如果把上面的代码用同步代码块包含起来,任意一个时间只能有一个哥们访问实例变量x,一直到这哥们执行完同步代码块中的所有代码后,其他哥们才能再访问。

❾ java中 synchronized同步处理后 为什么只有一个线程在运行

java中
synchronized同步处理后,代表该线程是同步的,即多线程访问时,无法同时有两个或以上线程进行访问。具体的原理是,当第一个线程进入该同步代码块之后,会暂时获得同步块的锁,当第二个线程进入时,由于第一个线程并未结束,同步代码块的锁没有释放,所以第二个线程进不来,达到只有一个线程在运行的目的。synchronized同步处理通常用于封装需要共享的可改变的数据,为了让数据更安全所使用的技术。

❿ java 中 synchronized 是什么意思

一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在java里边就是拿到某个同步对象的锁(一个对象只有一把锁); 如果这个时候同步对象的锁被其他线程拿走了,他(这个线程)就只能等了(线程阻塞在锁池等待队列中)。 取到锁后,他就开始执行同步代码(被synchronized修饰的代码);线程执行完同步代码后马上就把锁还给同步对象,其他在锁池中等待的某个线程就可以拿到锁执行同步代码了。这样就保证了同步代码在统一时刻只有一个线程在执行。
关于线程的同步,一般有以下解决方法:

1. 在需要同步的方法的方法签名中加入synchronized关键字。

2. 使用synchronized块对需要进行同步的代码段进行同步。

3. 使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象

阅读全文

与javasynchronized原理相关的资料

热点内容
苹果的文件管理在那里 浏览:633
qq浏览器文件如何发到qq 浏览:736
百度地图加载多个点代码 浏览:146
数据横向复制如何纵向粘贴 浏览:433
2020cab画图数据怎么调 浏览:534
teamview12linux 浏览:175
java编辑word文件 浏览:149
类似scihub的网站有哪些 浏览:398
ios哪里找小众app 浏览:377
毒霸新闻弹窗是哪个文件 浏览:331
雨林木win10 浏览:881
写好的代码怎么编程小程序 浏览:945
改文件属性软件 浏览:917
linux网卡重启新命令 浏览:216
win10升级工具下 浏览:935
电脑qq怎么传文件到手机qq 浏览:417
被360隔离的文件在哪个文件夹 浏览:971
骷髅教程图 浏览:954
ps淘宝女包修图教程 浏览:568
55公里app 浏览:556

友情链接