一知半解的,什么时候需要加synchronized

Phil_Jing 2018-05-23 03:54:44
之前改了一个bug,是多个用户用一个用户的身份登陆去生成随机账号会产生重复的数据,我直接在controller的此方法上加了一个synchronized就解决问题了。这几天也在查这方面的资料,网上就是铺天盖地的copy、paste,也不管对不对。多线程多线程,一直是一直是一知半解,多个用户同时登陆也算多线程吗?这个登陆需要加synchronized吗?跪求大佬解答一番,在下先行谢过。
...全文
1905 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
keanyumen212 2018-05-28
  • 打赏
  • 举报
回复
你现在是要保证 一个身份登录注册只能生成一个 对应的 随机账号,我理解这个不涉及多线程的问题。不需要加同步锁,只要报最终在数据库中的 数据 是 一个身份对应一个随机账号就可以了,那只要对这张表的 身份这个字段加唯一索引就可以了,这样就能保证一个身份只有一个账号。当多个用户用同一个身份同时注册登录时,只有最先完成的那个是成功的,其他都会抛出重复错误。你参考下这样设计是不是合理些
幽饮烛 2018-05-28
  • 打赏
  • 举报
回复
这个问题可是用了伪随机数。 至于如何理解 synchronized 关键字,必须先了解什么是多线程,什么是线程安全。
maradona1984 2018-05-28
  • 打赏
  • 举报
回复
引用 25 楼 phil_jing 的回复:
[quote=引用 20 楼 maradona1984 的回复:] [quote=引用 18 楼 phil_jing 的回复:] [quote=引用 16 楼 maradona1984 的回复:] 你得判断你的代码是否存在线程安全问题,再考虑怎么加锁 按照现有java web开发模式,按照规范来,绝大多数地方是不需要考虑线程安全问题的
哪些地方是需要考虑的呢[/quote] 存在被多个线程访问的对象,并且能被多个线程修改[/quote] 比如哪些场景[/quote] 什么场景自己多想想啊,而且跟代码实现有关,而且这个并非什么高深的东西,你自己代码那么写(我上面所说的存在被多个线程修改的对象)就需要考虑相应的问题. 并非需要什么场景. 最常见的场景就是懒汉式单例模式,单例的工厂方法是公共静态的,自然能被多个线程访问,方法里能访问某个私有静态变量,就等于这个变量可被多个线程访问到了并做修改
LikeWatchStar 2018-05-28
  • 打赏
  • 举报
回复
新建的class里包含了各种构造方法称作类,别的class想要调用这个class里的构造方法时,可以new 来新建对象,对象名.的方式调用方法,如果这个构造方法是被加上syn关键字的,指如果同一时间被多个地方调用执行,会一个一个顺序的执行,因为这个对象只有一个钥匙,一把锁,它已经锁上了,钥匙给了第一个需要调用的地方,执行完毕后把钥匙还给对象,对象在把钥匙给第二个,典型的就是取钱,虽然我并没有做过这个
Phil_Jing 2018-05-25
  • 打赏
  • 举报
回复
引用 20 楼 maradona1984 的回复:
[quote=引用 18 楼 phil_jing 的回复:] [quote=引用 16 楼 maradona1984 的回复:] 你得判断你的代码是否存在线程安全问题,再考虑怎么加锁 按照现有java web开发模式,按照规范来,绝大多数地方是不需要考虑线程安全问题的
哪些地方是需要考虑的呢[/quote] 存在被多个线程访问的对象,并且能被多个线程修改[/quote] 比如哪些场景
lindafengmiao 2018-05-24
  • 打赏
  • 举报
回复
有点不太理解
maradona1984 2018-05-24
  • 打赏
  • 举报
回复
你得判断你的代码是否存在线程安全问题,再考虑怎么加锁 按照现有java web开发模式,按照规范来,绝大多数地方是不需要考虑线程安全问题的
wxj521mdd 2018-05-24
  • 打赏
  • 举报
回复
在线程需要进行线程同步
  • 打赏
  • 举报
回复
引用 11 楼 phil_jing 的回复:
[quote=引用 10 楼 u010970951 的回复:] [quote=引用 9 楼 phil_jing 的回复:] [quote=引用 8 楼 u010970951 的回复:] [quote=引用 7 楼 phil_jing 的回复:] [quote=引用 6 楼 u010970951 的回复:] [quote=引用 5 楼 phil_jing 的回复:] [quote=引用 4 楼 u010970951 的回复:] [quote=引用 楼主 phil_jing 的回复:] 之前改了一个bug,是多个用户用一个用户的身份登陆去生成随机账号会产生重复的数据,我直接在controller的此方法上加了一个synchronized就解决问题了。这几天也在查这方面的资料,网上就是铺天盖地的copy、paste,也不管对不对。多线程多线程,一直是一直是一知半解,多个用户同时登陆也算多线程吗?这个登陆需要加synchronized吗?跪求大佬解答一番,在下先行谢过。
线程问题只可能存在同时操作的时候,所以说,如果你多个用户不同时间去登录应该也不会有问题。产生重复数据是什么意思你要说清楚[/quote] 那个是根据名称和邮箱去生成一个用户,密码随机生成的,因为产生一个需要去验证名称是否存在。之前就是因为如果同时生成一个相同名称的会产生一条多余的数据,所以我才在方法上加了一个关键词。 登陆是另外的方法,只有读数据库的操作。[/quote] 那我觉得也没必要纠结于这个登录的问题了,何时用synchronized,很简单,当你同时(同一时间)操作的时候,可能会影响其他操作的操作,就需要加synchronized关键字,至于你那个锁住对象,我觉得锁的范围太大了,你只要将生成的方法给锁起来就可以,在小一点,只要将产生冲突的部分加锁即可,synchronized可以保证你同时操作一个对象不会出现问题[/quote] 我是不是可以理解,除了读数据库的方法,其他的都需要加synchronized。 会产生死锁吗?如果产生了怎么解决[/quote] 简单的可以举个常见的例子: 银行取钱的例子,如果是二个人同时在操作一张卡,二个人取钱,如果只有500元,你取500他取500,不加锁的后果就是你取的时候余额还有500,可以取,他跟你同时取,他取的时候余额也还是500,然后二个人都取了500,那么就产生了问题了 你那个理解不太对,加synchronized会导致系统效率低,如果写的不适当,也有可能产生死锁。 synchronized这个东西,用的越少越好,而且范围越小越好,大概有:类对象>实例对象>代码块 继续上面那个例子,需要锁起来的仅仅是查询判断余额跟取钱二个操作即可,因为只要保证你在判断余额是否满足你取值的时候,其他人的取钱或者存钱操作都完成了,就不会出现问题 至于读数据库的方法,单纯的读是不会产生线程问题的,只有在write或者delete、update的时候,才有可能产生线程问题,所以读数据库不需要加锁,write或者delete、update这三个操作是需要加锁的(防止二个人同时操作,导致二个人不同步产生的线程问题) 在我看你描述中,你那个只需要在生成账号那里加锁,防止二个人同时生成,导致数据重复,保证前一个人生成完了,第二个人在去查询生成即可 [/quote] 那写在方法前的属于代码块还是实例对象 [/quote] 如果是静态方法。就是类对象,因为静态方法只有一个,对应类, 如果是普通方法,就是实例对象。 代码块是将一段代码包含在synchronized之中,类似: synchronized{ System.out.println("123131231"); } [/quote] 非常感谢你的回答,那多线程是不是就是多个线程在执行一个相同的操作? [/quote] 可以这么理解,多个人干同一个事情
小灰狼 2018-05-24
  • 打赏
  • 举报
回复
银行取钱的例子很多书上文章上都会介绍到 但是,在我带新人和学生的过程中发现,对 synchronized 关键字的理解上,还必须强调它锁的是一个对象、对象、对象。重要的事说三次 如果程序中一个类生成了多个对象,其中的某个实例方法上加了 synchronized,并且这个方法访问了共享资源,这时同样还是无法达到互斥的效果。 还是举个例子吧,一个公司有三个会议室(一个类,三个对象),公司有且只有一个录像机(DV,共享型资源,并且是互斥资源)用于记录每次开会的过程,并且要求每次会议都有记录


class DV {

}

class MeetingRoom{
    public static final DV SharedDV = new DV();
    
    public synchronized void meeting(){
        // ......
    }
    
}
......
 MettingRoom room1 = new MeetingRoom(), room2 = new MeetingRoom(), room3 = new MeetingRoom();
// 将 room1、room2、room3 分别交给三个线程,执行 MeetingRoom.meeting() 方法
在上面的代码中,虽然在 MeetingRoom.meeting 方法中加上了 synchronized,但却并不能实现对DV这个资源的互斥访问。要想实现对 DV 资源的互斥访问,synchronized 应该加在资源上:

public void meeting(){
    synchronized(MeetingRoom.SharedDV){
        ......
    }
}
诺丽果 2018-05-24
  • 打赏
  • 举报
回复
楼上的所有回复,我都看了一遍,多线程并不是多个人干同一件事,而是多线程是同步完成多项任务,为了提高资源使用效率来提高系统的效率,当然多线程也可以是多个人干同一件事,但这就会有并发的问题产生,楼上有几个人举了银行取钱的例子,这个是在常见不过的,很好理解的例子,这个时候就是有并发的问题,就得加锁,使用synchronized了。
maradona1984 2018-05-24
  • 打赏
  • 举报
回复
引用 18 楼 phil_jing 的回复:
[quote=引用 16 楼 maradona1984 的回复:] 你得判断你的代码是否存在线程安全问题,再考虑怎么加锁 按照现有java web开发模式,按照规范来,绝大多数地方是不需要考虑线程安全问题的
哪些地方是需要考虑的呢[/quote] 存在被多个线程访问的对象,并且能被多个线程修改
Phil_Jing 2018-05-24
  • 打赏
  • 举报
回复
引用 16 楼 maradona1984 的回复:
你得判断你的代码是否存在线程安全问题,再考虑怎么加锁 按照现有java web开发模式,按照规范来,绝大多数地方是不需要考虑线程安全问题的
哪些地方是需要考虑的呢
  • 打赏
  • 举报
回复
多个用户同时登陆不算多线程,这个登陆不需要加需要加synchronized,synchronized这个是用来修饰同步的,如果你加了这个方法可能导致同一时间多个用户登录出现延迟
Phil_Jing 2018-05-23
  • 打赏
  • 举报
回复
引用 10 楼 u010970951 的回复:
[quote=引用 9 楼 phil_jing 的回复:] [quote=引用 8 楼 u010970951 的回复:] [quote=引用 7 楼 phil_jing 的回复:] [quote=引用 6 楼 u010970951 的回复:] [quote=引用 5 楼 phil_jing 的回复:] [quote=引用 4 楼 u010970951 的回复:] [quote=引用 楼主 phil_jing 的回复:] 之前改了一个bug,是多个用户用一个用户的身份登陆去生成随机账号会产生重复的数据,我直接在controller的此方法上加了一个synchronized就解决问题了。这几天也在查这方面的资料,网上就是铺天盖地的copy、paste,也不管对不对。多线程多线程,一直是一直是一知半解,多个用户同时登陆也算多线程吗?这个登陆需要加synchronized吗?跪求大佬解答一番,在下先行谢过。
线程问题只可能存在同时操作的时候,所以说,如果你多个用户不同时间去登录应该也不会有问题。产生重复数据是什么意思你要说清楚[/quote] 那个是根据名称和邮箱去生成一个用户,密码随机生成的,因为产生一个需要去验证名称是否存在。之前就是因为如果同时生成一个相同名称的会产生一条多余的数据,所以我才在方法上加了一个关键词。 登陆是另外的方法,只有读数据库的操作。[/quote] 那我觉得也没必要纠结于这个登录的问题了,何时用synchronized,很简单,当你同时(同一时间)操作的时候,可能会影响其他操作的操作,就需要加synchronized关键字,至于你那个锁住对象,我觉得锁的范围太大了,你只要将生成的方法给锁起来就可以,在小一点,只要将产生冲突的部分加锁即可,synchronized可以保证你同时操作一个对象不会出现问题[/quote] 我是不是可以理解,除了读数据库的方法,其他的都需要加synchronized。 会产生死锁吗?如果产生了怎么解决[/quote] 简单的可以举个常见的例子: 银行取钱的例子,如果是二个人同时在操作一张卡,二个人取钱,如果只有500元,你取500他取500,不加锁的后果就是你取的时候余额还有500,可以取,他跟你同时取,他取的时候余额也还是500,然后二个人都取了500,那么就产生了问题了 你那个理解不太对,加synchronized会导致系统效率低,如果写的不适当,也有可能产生死锁。 synchronized这个东西,用的越少越好,而且范围越小越好,大概有:类对象>实例对象>代码块 继续上面那个例子,需要锁起来的仅仅是查询判断余额跟取钱二个操作即可,因为只要保证你在判断余额是否满足你取值的时候,其他人的取钱或者存钱操作都完成了,就不会出现问题 至于读数据库的方法,单纯的读是不会产生线程问题的,只有在write或者delete、update的时候,才有可能产生线程问题,所以读数据库不需要加锁,write或者delete、update这三个操作是需要加锁的(防止二个人同时操作,导致二个人不同步产生的线程问题) 在我看你描述中,你那个只需要在生成账号那里加锁,防止二个人同时生成,导致数据重复,保证前一个人生成完了,第二个人在去查询生成即可 [/quote] 那写在方法前的属于代码块还是实例对象 [/quote] 如果是静态方法。就是类对象,因为静态方法只有一个,对应类, 如果是普通方法,就是实例对象。 代码块是将一段代码包含在synchronized之中,类似: synchronized{ System.out.println("123131231"); } [/quote] 非常感谢你的回答,那多线程是不是就是多个线程在执行一个相同的操作?
  • 打赏
  • 举报
回复
引用 9 楼 phil_jing 的回复:
[quote=引用 8 楼 u010970951 的回复:] [quote=引用 7 楼 phil_jing 的回复:] [quote=引用 6 楼 u010970951 的回复:] [quote=引用 5 楼 phil_jing 的回复:] [quote=引用 4 楼 u010970951 的回复:] [quote=引用 楼主 phil_jing 的回复:] 之前改了一个bug,是多个用户用一个用户的身份登陆去生成随机账号会产生重复的数据,我直接在controller的此方法上加了一个synchronized就解决问题了。这几天也在查这方面的资料,网上就是铺天盖地的copy、paste,也不管对不对。多线程多线程,一直是一直是一知半解,多个用户同时登陆也算多线程吗?这个登陆需要加synchronized吗?跪求大佬解答一番,在下先行谢过。
线程问题只可能存在同时操作的时候,所以说,如果你多个用户不同时间去登录应该也不会有问题。产生重复数据是什么意思你要说清楚[/quote] 那个是根据名称和邮箱去生成一个用户,密码随机生成的,因为产生一个需要去验证名称是否存在。之前就是因为如果同时生成一个相同名称的会产生一条多余的数据,所以我才在方法上加了一个关键词。 登陆是另外的方法,只有读数据库的操作。[/quote] 那我觉得也没必要纠结于这个登录的问题了,何时用synchronized,很简单,当你同时(同一时间)操作的时候,可能会影响其他操作的操作,就需要加synchronized关键字,至于你那个锁住对象,我觉得锁的范围太大了,你只要将生成的方法给锁起来就可以,在小一点,只要将产生冲突的部分加锁即可,synchronized可以保证你同时操作一个对象不会出现问题[/quote] 我是不是可以理解,除了读数据库的方法,其他的都需要加synchronized。 会产生死锁吗?如果产生了怎么解决[/quote] 简单的可以举个常见的例子: 银行取钱的例子,如果是二个人同时在操作一张卡,二个人取钱,如果只有500元,你取500他取500,不加锁的后果就是你取的时候余额还有500,可以取,他跟你同时取,他取的时候余额也还是500,然后二个人都取了500,那么就产生了问题了 你那个理解不太对,加synchronized会导致系统效率低,如果写的不适当,也有可能产生死锁。 synchronized这个东西,用的越少越好,而且范围越小越好,大概有:类对象>实例对象>代码块 继续上面那个例子,需要锁起来的仅仅是查询判断余额跟取钱二个操作即可,因为只要保证你在判断余额是否满足你取值的时候,其他人的取钱或者存钱操作都完成了,就不会出现问题 至于读数据库的方法,单纯的读是不会产生线程问题的,只有在write或者delete、update的时候,才有可能产生线程问题,所以读数据库不需要加锁,write或者delete、update这三个操作是需要加锁的(防止二个人同时操作,导致二个人不同步产生的线程问题) 在我看你描述中,你那个只需要在生成账号那里加锁,防止二个人同时生成,导致数据重复,保证前一个人生成完了,第二个人在去查询生成即可 [/quote] 那写在方法前的属于代码块还是实例对象 [/quote] 如果是静态方法。就是类对象,因为静态方法只有一个,对应类, 如果是普通方法,就是实例对象。 代码块是将一段代码包含在synchronized之中,类似: synchronized{ System.out.println("123131231"); }
Phil_Jing 2018-05-23
  • 打赏
  • 举报
回复
引用 8 楼 u010970951 的回复:
[quote=引用 7 楼 phil_jing 的回复:] [quote=引用 6 楼 u010970951 的回复:] [quote=引用 5 楼 phil_jing 的回复:] [quote=引用 4 楼 u010970951 的回复:] [quote=引用 楼主 phil_jing 的回复:] 之前改了一个bug,是多个用户用一个用户的身份登陆去生成随机账号会产生重复的数据,我直接在controller的此方法上加了一个synchronized就解决问题了。这几天也在查这方面的资料,网上就是铺天盖地的copy、paste,也不管对不对。多线程多线程,一直是一直是一知半解,多个用户同时登陆也算多线程吗?这个登陆需要加synchronized吗?跪求大佬解答一番,在下先行谢过。
线程问题只可能存在同时操作的时候,所以说,如果你多个用户不同时间去登录应该也不会有问题。产生重复数据是什么意思你要说清楚[/quote] 那个是根据名称和邮箱去生成一个用户,密码随机生成的,因为产生一个需要去验证名称是否存在。之前就是因为如果同时生成一个相同名称的会产生一条多余的数据,所以我才在方法上加了一个关键词。 登陆是另外的方法,只有读数据库的操作。[/quote] 那我觉得也没必要纠结于这个登录的问题了,何时用synchronized,很简单,当你同时(同一时间)操作的时候,可能会影响其他操作的操作,就需要加synchronized关键字,至于你那个锁住对象,我觉得锁的范围太大了,你只要将生成的方法给锁起来就可以,在小一点,只要将产生冲突的部分加锁即可,synchronized可以保证你同时操作一个对象不会出现问题[/quote] 我是不是可以理解,除了读数据库的方法,其他的都需要加synchronized。 会产生死锁吗?如果产生了怎么解决[/quote] 简单的可以举个常见的例子: 银行取钱的例子,如果是二个人同时在操作一张卡,二个人取钱,如果只有500元,你取500他取500,不加锁的后果就是你取的时候余额还有500,可以取,他跟你同时取,他取的时候余额也还是500,然后二个人都取了500,那么就产生了问题了 你那个理解不太对,加synchronized会导致系统效率低,如果写的不适当,也有可能产生死锁。 synchronized这个东西,用的越少越好,而且范围越小越好,大概有:类对象>实例对象>代码块 继续上面那个例子,需要锁起来的仅仅是查询判断余额跟取钱二个操作即可,因为只要保证你在判断余额是否满足你取值的时候,其他人的取钱或者存钱操作都完成了,就不会出现问题 至于读数据库的方法,单纯的读是不会产生线程问题的,只有在write或者delete、update的时候,才有可能产生线程问题,所以读数据库不需要加锁,write或者delete、update这三个操作是需要加锁的(防止二个人同时操作,导致二个人不同步产生的线程问题) 在我看你描述中,你那个只需要在生成账号那里加锁,防止二个人同时生成,导致数据重复,保证前一个人生成完了,第二个人在去查询生成即可 [/quote] 那写在方法前的属于代码块还是实例对象
  • 打赏
  • 举报
回复
引用 7 楼 phil_jing 的回复:
[quote=引用 6 楼 u010970951 的回复:] [quote=引用 5 楼 phil_jing 的回复:] [quote=引用 4 楼 u010970951 的回复:] [quote=引用 楼主 phil_jing 的回复:] 之前改了一个bug,是多个用户用一个用户的身份登陆去生成随机账号会产生重复的数据,我直接在controller的此方法上加了一个synchronized就解决问题了。这几天也在查这方面的资料,网上就是铺天盖地的copy、paste,也不管对不对。多线程多线程,一直是一直是一知半解,多个用户同时登陆也算多线程吗?这个登陆需要加synchronized吗?跪求大佬解答一番,在下先行谢过。
线程问题只可能存在同时操作的时候,所以说,如果你多个用户不同时间去登录应该也不会有问题。产生重复数据是什么意思你要说清楚[/quote] 那个是根据名称和邮箱去生成一个用户,密码随机生成的,因为产生一个需要去验证名称是否存在。之前就是因为如果同时生成一个相同名称的会产生一条多余的数据,所以我才在方法上加了一个关键词。 登陆是另外的方法,只有读数据库的操作。[/quote] 那我觉得也没必要纠结于这个登录的问题了,何时用synchronized,很简单,当你同时(同一时间)操作的时候,可能会影响其他操作的操作,就需要加synchronized关键字,至于你那个锁住对象,我觉得锁的范围太大了,你只要将生成的方法给锁起来就可以,在小一点,只要将产生冲突的部分加锁即可,synchronized可以保证你同时操作一个对象不会出现问题[/quote] 我是不是可以理解,除了读数据库的方法,其他的都需要加synchronized。 会产生死锁吗?如果产生了怎么解决[/quote] 简单的可以举个常见的例子: 银行取钱的例子,如果是二个人同时在操作一张卡,二个人取钱,如果只有500元,你取500他取500,不加锁的后果就是你取的时候余额还有500,可以取,他跟你同时取,他取的时候余额也还是500,然后二个人都取了500,那么就产生了问题了 你那个理解不太对,加synchronized会导致系统效率低,如果写的不适当,也有可能产生死锁。 synchronized这个东西,用的越少越好,而且范围越小越好,大概有:类对象>实例对象>代码块 继续上面那个例子,需要锁起来的仅仅是查询判断余额跟取钱二个操作即可,因为只要保证你在判断余额是否满足你取值的时候,其他人的取钱或者存钱操作都完成了,就不会出现问题 至于读数据库的方法,单纯的读是不会产生线程问题的,只有在write或者delete、update的时候,才有可能产生线程问题,所以读数据库不需要加锁,write或者delete、update这三个操作是需要加锁的(防止二个人同时操作,导致二个人不同步产生的线程问题) 在我看你描述中,你那个只需要在生成账号那里加锁,防止二个人同时生成,导致数据重复,保证前一个人生成完了,第二个人在去查询生成即可
Phil_Jing 2018-05-23
  • 打赏
  • 举报
回复
引用 6 楼 u010970951 的回复:
[quote=引用 5 楼 phil_jing 的回复:] [quote=引用 4 楼 u010970951 的回复:] [quote=引用 楼主 phil_jing 的回复:] 之前改了一个bug,是多个用户用一个用户的身份登陆去生成随机账号会产生重复的数据,我直接在controller的此方法上加了一个synchronized就解决问题了。这几天也在查这方面的资料,网上就是铺天盖地的copy、paste,也不管对不对。多线程多线程,一直是一直是一知半解,多个用户同时登陆也算多线程吗?这个登陆需要加synchronized吗?跪求大佬解答一番,在下先行谢过。
线程问题只可能存在同时操作的时候,所以说,如果你多个用户不同时间去登录应该也不会有问题。产生重复数据是什么意思你要说清楚[/quote] 那个是根据名称和邮箱去生成一个用户,密码随机生成的,因为产生一个需要去验证名称是否存在。之前就是因为如果同时生成一个相同名称的会产生一条多余的数据,所以我才在方法上加了一个关键词。 登陆是另外的方法,只有读数据库的操作。[/quote] 那我觉得也没必要纠结于这个登录的问题了,何时用synchronized,很简单,当你同时(同一时间)操作的时候,可能会影响其他操作的操作,就需要加synchronized关键字,至于你那个锁住对象,我觉得锁的范围太大了,你只要将生成的方法给锁起来就可以,在小一点,只要将产生冲突的部分加锁即可,synchronized可以保证你同时操作一个对象不会出现问题[/quote] 我是不是可以理解,除了读数据库的方法,其他的都需要加synchronized。 会产生死锁吗?如果产生了怎么解决
  • 打赏
  • 举报
回复
引用 5 楼 phil_jing 的回复:
[quote=引用 4 楼 u010970951 的回复:] [quote=引用 楼主 phil_jing 的回复:] 之前改了一个bug,是多个用户用一个用户的身份登陆去生成随机账号会产生重复的数据,我直接在controller的此方法上加了一个synchronized就解决问题了。这几天也在查这方面的资料,网上就是铺天盖地的copy、paste,也不管对不对。多线程多线程,一直是一直是一知半解,多个用户同时登陆也算多线程吗?这个登陆需要加synchronized吗?跪求大佬解答一番,在下先行谢过。
线程问题只可能存在同时操作的时候,所以说,如果你多个用户不同时间去登录应该也不会有问题。产生重复数据是什么意思你要说清楚[/quote] 那个是根据名称和邮箱去生成一个用户,密码随机生成的,因为产生一个需要去验证名称是否存在。之前就是因为如果同时生成一个相同名称的会产生一条多余的数据,所以我才在方法上加了一个关键词。 登陆是另外的方法,只有读数据库的操作。[/quote] 那我觉得也没必要纠结于这个登录的问题了,何时用synchronized,很简单,当你同时(同一时间)操作的时候,可能会影响其他操作的操作,就需要加synchronized关键字,至于你那个锁住对象,我觉得锁的范围太大了,你只要将生成的方法给锁起来就可以,在小一点,只要将产生冲突的部分加锁即可,synchronized可以保证你同时操作一个对象不会出现问题
加载更多回复(5)

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧