重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
对象是一个锁标志。按照先到先得的原则,如果有多个线程都会执行代码,并使用同一个对象作为锁,
渝北网站制作公司哪家好,找创新互联公司!从网页设计、网站建设、微信开发、APP开发、成都响应式网站建设公司等网站项目制作,到程序开发,运营维护。创新互联公司自2013年起到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联公司。
synchronize(对象){ .... }
那么,先执行这段代码的那个线程,将会获得这个对象锁,而当这个线程执行这段代码的时候,其他线程也是使用这个对象作为锁的,就不能执行这段代码,知道最初得到这个锁的线程运行完这段代码,然后再把锁分配给下一个线程执行。
主要为了多线程访问共享资源时,保证只能有一个线程操作资源,比如说一个servlet中对根据参数
一个公共变量设置值
,如果不采用lock那么在并发访问时就无法保证每个线程中公共变量设置的值都是各自线程的,在后续的应用中变量的值可能会错乱,加了lock之后就保证了在一个线程中从头到尾都是一致的
对象锁是指Java为临界区synchronized(Object)语句指定的对象进行加锁,
对象锁是独占排他锁。
对象锁用于程序片段或者method上
此时将获得对象的锁,所有想要进入该对象的synchronized的方法或者代码段的线程都必须获取对象的锁,如果没有,则必须等其他线程释放该锁。
synchronized块 锁定的是制定对象,,,,,代码块只是锁定期间执行的操作
synchronized 修饰非静态方法 锁定的是该类的实例 同一实例在多线程中调用才会触发同步锁定 所以 多个被synchronized修饰的非静态方法在同一实例下 只能多线程同时调用一个
synchronized 修饰静态方法 锁定的是类本身,而不是实例, 同一个类中的所有被synchronized修饰的静态方法, 只能多线程同时调用一个
synchronized块 直接锁定指定的对象,,,,该对象在多个地方的同步锁定块,,,只能多线程同时执行其中一个
其他未获得锁的线程需要等待获得锁的线程执行完成并释放锁,
如果同时有多个线程等待锁释放,,那么锁释放后,等待的线程谁会获得锁,,这个不同JVM可能有差异
public class Run
{
Object lock;
public synchronized void runA()
{
}
public synchronized void runB()
{
}
public void runC()
{
synchronized (this)
{
}
}
public void runD()
{
synchronized (lock)
{
}
}
}
举例: 以上runA,runB,runC三个方法在同一实例多线程中互斥,他们都锁定的是this,当前类且调用当前方法的实例
而runD方法不和上面三个互斥,因为锁定的不是this,而是lock
多线程的同步锁通过synchronized实现
有俩种方式 一种是在代码块加锁
代码块加锁时可以指定任意类的实例过的对象
即锁在这个对象上(任何对象都有一个锁)
使同一时间内只有一个线程可以访问到代码块中
另外一种就是以synchronized关键字修饰方法
这时加锁的对象就是类本身的实例 即this
以上 O(∩_∩)O
synchronized(这里的对象你看成一道门) {
这里是一个人进来了,把门反锁了
需要同步操作的代码
这里是里面的人事情做完了,出去了,门开着其他人可以进了
}
至于怎么锁的,这是java和jvm的规定和实现细节,作为普通程序员没必要深入那么多。