Studying is just a fraction of learning and helps you get a grip on the fundamental concepts and interdependencies of the various sub-topics.
However, in my opinion, real understanding only comes from practice.
As a Chinese proverb attributed to Confucius says,
Tell me and I'll forget; show me and I
may remember; involve me [or: let me
do] and I'll understand.
A good way that helps you master many subjects at a time is working projects that somehow involves them and that go well beyond the scope of the usual course exercises, for example writing a useful application in Java that heavily relies on a database to function.
You will learn a lot from designing and implementing such a thing, and questions will automatically arise seemingly out of nowhere which will drive you further in your learning process.
If you feel that you do not have enough knowledge and experience to do such a project, approach it in a top-down manner, for example (speaking of a software project):
- What do I want to create ?
- How is it supposed to work ? What should it do ?
- How could I implement a particular function ? What do I need to accomplish my task ?
Additionally, you can also learn a lot from reading other people's code.
I found it useful to take an open source program I use and ask myself how it performs a particular task, going through the application step by step to see what it does, why it does it and why it does it that way and not differently.
On understanding operating systems concepts, well... that may be a bit more difficult but I think that getting good at software design and hands-on experience with multiprocess/multithreaded architectures are probably important because you will understand the problems OSes have to deal with – knowing the question helps you find the answer.