.synchronized与static synchronized 的区别

synchronized与static synchronized 的区别

  1.synchronized与static synchronized 的区别
      synchronized是对类的当前实例进行加锁,防止其他线程同时访问该类的该实例的所有synchronized块,注意这里是“类的当前实例”, 类的两个不同实例就没有这种约束了。那么static synchronized恰好就是要控制类的所有实例的访问了,static synchronized是限制线程同时访问jvm中该类的所有实例同时访问对应的代码快。实际上,在类中某方法或某代码块中有 synchronized,那么在生成一个该类实例后,改类也就有一个监视快,放置线程并发访问改实例synchronized保护快,而static synchronized则是所有该类的实例公用一个监视快了,也也就是两个的区别了,也就是synchronized相当于 this.synchronized,而
static synchronized相当于Something.synchronized.
      一个日本作者-结成浩的《java多线程设计模式》有这样的一个列子:
      pulbic class Something(){
         public synchronized void isSyncA(){}
         public synchronized void isSyncB(){}
         public static synchronized void cSyncA(){}
         public static synchronized void cSyncB(){}
     }
   那么,加入有Something类的两个实例a与b,那么下列组方法何以被1个以上线程同时访问呢
   a.   x.isSyncA()与x.isSyncB() 
   b.   x.isSyncA()与y.isSyncA()
   c.   x.cSyncA()与y.cSyncB()
   d.   x.isSyncA()与Something.cSyncA()
    这里,很清楚的可以判断:
   a,都是对同一个实例的synchronized域访问,因此不能被同时访问
   b,是针对不同实例的,因此可以同时被访问
   c,因为是static synchronized,所以不同实例之间仍然会被限制,相当于Something.isSyncA()与   Something.isSyncB()了,因此不能被同时访问。
   那么,第d呢?,书上的 答案是可以被同时访问的,答案理由是synchronzied的是实例方法与synchronzied的类方法由于锁定(lock)不同的原因。
   个人分析也就是synchronized 与static synchronized 相当于两帮派,各自管各自,相互之间就无约束了,可以被同时访问。目前还不是分清楚java内部设计synchronzied是怎么样实现的。


    结论:A: synchronized static是某个类的范围,synchronized static cSync{}防止多个线程同时访问这个    类中的synchronized static 方法。它可以对类的所有对象实例起作用。
   
               B: synchronized 是某实例的范围,synchronized isSync(){}防止多个线程同时访问这个实例中的synchronized 方法。



     2.synchronized方法与synchronized代码快的区别
      synchronized methods(){} 与synchronized(this){}之间没有什么区别,只是
 synchronized methods(){} 便于阅读理解,而synchronized(this){}可以更精确的控制冲突限制访问区域,有时候表现更高效率。


     3.
synchronized关键字是不能继承的
     这个在http://www.learndiary.com/archives/diaries/2910.htm一文中看到的,我想这一点也是很值得注意的,继承时子类的覆盖方法必须显示定义成synchronized

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ArrayList 是 Java 中的一种可变长度的数组,可以使用 synchronized 来保护 ArrayList 免受多线程并发访问的安全问题。下面是一个使用 synchronized 对 ArrayList 进行操作的示例: List<String> list = Collections.synchronizedList(new ArrayList<String>()); // 在多线程的环境中,使用 synchronized 块来对 list 进行操作 synchronized(list) { list.add("item"); list.remove("item"); } ### 回答2: 在Java中,ArrayList是一种线程不安全的容器,当多个线程同时访问和修改ArrayList时,可能会导致数据不一致性和线程安全问题。为了解决这个问题,可以使用ArrayList的Synchronized方法来创建线程安全的ArrayList。 示例代码如下: ``` import java.util.ArrayList; import java.util.Collections; import java.util.List; public class ThreadSafeArrayListExample { public static void main(String[] args) { // 创建一个普通的ArrayList List<String> arrayList = new ArrayList<>(); // 将普通的ArrayList转换为线程安全的ArrayList List<String> synchronizedList = Collections.synchronizedList(arrayList); // 在多个线程中同时访问和修改线程安全的ArrayList Thread thread1 = new Thread(() -> { synchronized (synchronizedList) { synchronizedList.add("Hello"); System.out.println("Thread 1 added element to the list"); } }); Thread thread2 = new Thread(() -> { synchronized (synchronizedList) { synchronizedList.add("World"); System.out.println("Thread 2 added element to the list"); } }); thread1.start(); thread2.start(); try { thread1.join(); thread2.join(); } catch (InterruptedException e) { e.printStackTrace(); } // 打印线程安全的ArrayList System.out.println("Thread safe list: " + synchronizedList); } } ``` 在上述示例中,首先创建了一个普通的ArrayList对象。然后,使用`Collections.synchronizedList()`方法将其转换为线程安全的ArrayList,这个方法返回一个同步包装器类,将普通的ArrayList包装成线程安全的List。 然后,在两个线程中同时访问和修改线程安全的ArrayList。使用`synchronized`关键字来确保在修改ArrayList之前获取线程安全集合的锁。这样可以保证在同一时间只有一个线程能够对集合进行操作,避免数据不一致性和线程安全问题。 最后,打印线程安全的ArrayList,可以看到两个线程同时向集合中添加元素的结果。 ### 回答3: 在Java中,ArrayList.Synchronized是一个同步的方法,它可以用来创建一个线程安全的ArrayList。 下面是一个使用ArrayList.Synchronized的示例: ``` import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Example { public static void main(String[] args) { // 创建一个普通的ArrayList List<String> arrayList = new ArrayList<>(); // 使用Collections类的synchronizedList方法将ArrayList转换为线程安全的ArrayList List<String> synchronizedList = Collections.synchronizedList(arrayList); // 使用synchronizedList进行操作 synchronized (synchronizedList) { synchronizedList.add("元素1"); synchronizedList.add("元素2"); // ... System.out.println(synchronizedList); } } } ``` 在上面的示例中,我们首先创建了一个普通的ArrayList。然后,使用Collections类的synchronizedList方法将其转换为线程安全的ArrayList。该方法返回一个封装了原始ArrayList的List对象,并对其所有方法进行了同步化处理。 在使用synchronizedList进行操作时,我们需要使用synchronized语句块来确保多个线程对集合的操作是同步的。在示例中,我们使用synchronized关键字对synchronizedList进行了同步,并在同步块中添加了一些元素到集合中。最后,通过输出synchronizedList来验证操作的结果。 这样,我们就通过ArrayList.Synchronized方法创建了一个线程安全的ArrayList,并通过synchronized关键字对其进行了同步。这样可以确保在多线程环境下的操作是安全的,避免了可能的并发问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值